web-dev-qa-db-fra.com

Comment router sans templateUrl?

D'accord. J'ai une configuration d'URL pour déconnecter un utilisateur. Sur le serveur, il n'y a pas de html. La session sur le serveur est simplement détruite, puis l'utilisateur est redirigé vers une adresse.

Cela fonctionne très bien avec du HTML simple, mais avec Angular j'ai des problèmes. J'ai routé toutes les routes principales en utilisant $routeProvider.when('/foo', {templateUrl: '/foo.html', controller: 'Ctrl'}) et cela fonctionne très bien pour les routes modèles normales .. cependant, s'il n'y a pas de modèle, cela ne fonctionnera pas.

Alors, comment puis-je prendre en charge l'itinéraire /logout de la même manière que ci-dessus, quand il n'y a pas de modèle html?

30
Lee Olayvar

Une solution de contournement consiste à utiliser template au lieu de templateUrl. De la Documents angulaires :

template - {string =} - modèle html en tant que chaîne qui doit être utilisée par les directives ngView ou ngInclude. cette propriété a priorité sur templateUrl.

Cela peut être utilisé comme suit:

$routeProvider.when("/foo", {template: " ", controller: "Ctrl"});

Remarque: vous devez utiliser " " Au lieu d'une chaîne vide "" Car Angular utilise une vérification if (template) avant de tirer le contrôleur, et un une chaîne vide donne la valeur false.

-- ÉDITER --

Une meilleure façon de le faire est d'utiliser la carte resolve. Voir les Angular Docs :

resolver - {Object. =} - Une carte facultative des dépendances qui devrait être injectée dans le contrôleur.

Cela peut être utilisé comme ceci:

$routeProvider.when('/foo', {resolve: {redirect: 'RedirectService'}});

Remarque: je l'ai changé de "Ctrl" en "RedirectService", car ce que vous décrivez dans la question n'est pas vraiment un "contrôleur" dans le sens Angular. Il ne fait pas ' t définir la portée d'une vue. Au lieu de cela, il s'agit plutôt d'un service, qui finit par rediriger.

59
Lukas

J'écris la solution sur la base de la réponse déjà acceptée et du problème de github mentionné dans ses commentaires.


L'approche que j'utilise est un paramètre resolve dans le $routeProvider. Dans mon cas, j'essayais de créer une bonne solution pour déconnexion dans mon application, lorsque l'utilisateur accède à /déconnexion .

Exemple de code de $routeProvider:

app.config(['$routeProvider', function ($routeProvider) {
    $routeProvider.
        ...
        when('/logout', {
            resolve: {
                logout: ['logoutService', function (logoutService) {
                    logoutService();
                }]
            },
        }).
        ...
}]);

Dans la partie résoudre, vous spécifiez un service (usine) par son nom et plus tard vous devez l'appeler. C'est toujours la meilleure solution.

Pour compléter l'exemple, je présente mon logoutService:

angular.module('xxx').factory('logoutService', function ($location, Auth) {
    return function () {
       Auth.setUser(undefined);
       $location.path('/');
    }
});

Fonctionne très bien!

9
Atais