96 votes

Sinon, sur StateProvider

En utilisant angular-ui-router, comment puis-je utiliser le méthode inverse en $stateProvider ou comment puis-je l'utiliser ?

0 votes

Qu'est-ce que vous essayez de faire ? (Veuillez noter que je ne comprends pas tout à fait $stateProvider.otherwise donc ça va m'aider)

124voto

Richard Keller Points 421

Vous ne pouvez pas utiliser seulement $stateProvider .

Vous devez injecter $urlRouterProvider et créer un code similaire à :

$urlRouterProvider.otherwise('/otherwise');

En /otherwise url doit être défini sur un état comme d'habitude :

 $stateProvider
    .state("otherwise", { url : '/otherwise'...})

Voir ce lien où ksperling explique

1 votes

Vous pouvez en fait utiliser $stateProvider . C'est moins de travail si vous voulez juste afficher un modèle, mais pas de redirection. Je préfère la réponse de @juan-hernandez.

0 votes

La valeur passée à otherwise (dans ce cas '/otherwise' ) doivent correspondre au nom de l'état (le premier paramètre de la fonction .state ) ou la valeur pour url option ?

0 votes

Cette fonction est désormais obsolète - voir réponse de @babyburger

83voto

Juan Hernandez Points 794

Vous pouvez avec $stateProvider en utilisant le syntaxe "tout compris ( "*path" ). Il vous suffit d'ajouter une configuration d'état au bas de votre liste comme la suivante :

$stateProvider.state("otherwise", {
    url: "*path",
    templateUrl: "views/error-not-found.html"
});

Toutes les options sont expliquées dans https://github.com/angular-ui/ui-router/wiki/URL-Routing#regex-parameters .

L'avantage de cette option, par rapport à l'option $urlRouterProvider.otherwise(...) c'est que vous n'êtes pas obligé de changer de lieu.

0 votes

Pourriez-vous nous en dire plus ? you're not forced to a location change ?

1 votes

Ce qu'il veut dire, c'est que l'url restera ce qu'elle était. Donc si l'utilisateur va sur /this/does/not/exist l'URL restera ainsi dans la barre d'adresse. L'autre solution vous amènera à /otherwise

0 votes

J'ai utilisé votre solution et cela a fonctionné (je peux garder l'url qui n'a pas été trouvée, ce qui est génial car j'utilise luisfarzati.github.io/angulartics et de cette façon, je peux également voir la navigation vers des pages qui n'ont pas été trouvées) pour les cas où l'url vers laquelle l'utilisateur navigue n'existe pas. Cependant, si je navigue vers cet url en utilisant $state.go('otherwise') dans un contrôleur, je perds l'url. Je navigue explicitement vers cet état lorsque l'utilisateur se rend sur la page de détails d'un élément et que le serveur renvoie 404 (par exemple si l'élément a été supprimé). Connaissez-vous un moyen de résoudre ce problème ?

36voto

Zak Henry Points 490

Vous pouvez également injecter manuellement $state dans la fonction otherwise, qui vous permet alors de naviguer vers un état non-url. Cela présente l'avantage que le navigateur ne modifie pas la barre d'adresse, ce qui est utile pour gérer le retour à une page précédente.

    $urlRouterProvider.otherwise(function ($injector, $location) {
        var $state = $injector.get('$state');

        $state.go('defaultLayout.error', {
            title: "Page not found",
            message: 'Could not find a state associated with url "'+$location.$$url+'"'
        });
    });

0 votes

Cela a résolu mon problème sur la façon de vérifier si nous sommes en milieu d'application ou en cours de chargement lorsque d'autres sont utilisés - merci beaucoup :)

0 votes

Vous avez sauvé ma journée !

0 votes

N'oubliez pas que si vous voulez minimiser cela, vous avez besoin de $inject.

4voto

Babyburger Points 496

Je veux juste ajouter mon grain de sel aux excellentes réponses qui ont déjà été fournies. La dernière version de @uirouter/angularjs a marqué la classe UrlRouterProvider comme étant déprécié. Il est désormais recommandé d'utiliser UrlService à la place. Vous pouvez obtenir le même résultat avec la modification suivante :

$urlService.rules.otherwise('/defaultState');

Méthodes supplémentaires : https://ui-router.github.io/ng1/docs/1.0.16/interfaces/url.urlrulesapi.html

3voto

Adio Points 1712

Ok, c'est le moment où vous réalisez que la question que vous avez posée trouve déjà sa réponse dans les premières lignes de l'exemple de code ! Jetez simplement un coup d'oeil à l'exemple de code.

       angular.module('sample', ['ui.compat'])
      .config(
        [        '$stateProvider', '$routeProvider', '$urlRouterProvider',
        function ($stateProvider,   $routeProvider,   $urlRouterProvider) {
          $urlRouterProvider
            .when('/c?id', '/contacts/:id')
            .otherwise('/'); // <-- This is what I was looking for ! 

          ....

Jetez un coup d'œil ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X