Les routes angularjs peuvent-elles avoir des valeurs de paramètres optionnelles?

Puis-je définir une route avec des paramètres optionnels (même modèle et contrôleur, mais certains paramètres doivent être ignorés s'ils n'existent pas?

Donc, au lieu d'écrire les deux règles suivantes, n'en avoir qu'une?

module.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
     when('/users/', {templateUrl: 'template.tpl.html', controller: myCtrl}).            
     when('/users/:userId', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Quelque Chose comme ceci ([ce paramètre est facultatif])

when('/users[/:userId]', {templateUrl: 'template.tpl.html', controller: myCtrl})
//note: this previous doesn't work

Je n'ai rien trouvé dans leur documentation.

156
demandé sur Alexandru Rada 2013-07-07 13:45:06

5 réponses

Il semble Qu'Angular ait un support pour cela maintenant.

De la dernière (v1.2. 0) docs pour $routeProvider.when(path, route):

path peut contenir en option des groupes nommés avec un point d'interrogation (:name?)

231
répondu g-eorge 2018-02-20 20:02:45

Comme @george mentionner, vous pouvez le faire comme ceci:

module.config(['$routeProvider', function($routeProvider) {
$routeProvider.
  when('/users/:userId?', {templateUrl: 'template.tpl.html', controller: myCtrl})
}]);

Vous pouvez également faire autant que vous avez besoin de paramètres optionnels.

53
répondu zmilan 2015-07-08 18:01:57

Veuillez voir la réponse de @jlareau ici: https://stackoverflow.com/questions/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Vous pouvez utiliser une fonction pour générer la chaîne de modèle:

var app = angular.module('app',[]);

app.config(
    function($routeProvider) {
        $routeProvider.
            when('/', {templateUrl:'/home'}).
            when('/users/:user_id', 
                {   
                    controller:UserView, 
                    templateUrl: function(params){ return '/users/view/' + params.user_id;   }
                }
            ).
            otherwise({redirectTo:'/'});
    }
);
8
répondu chrisjordanme 2017-05-23 12:10:08

En fait, je pense QU'OZ_ peut être quelque peu correct.

Si vous avez la route '/users/:userId' et naviguez vers '/users/' (notez le final /), $routeParams dans votre contrôleur devrait être un objet contenant userId: "" dans 1.1.5. Donc non, le paramater userId n'est pas complètement ignoré, mais je pense que c'est le meilleur que vous obtiendrez.

2
répondu Roy Daniels 2013-07-07 21:23:47

@ JamesBell vous pouvez utiliser l'option squash comme cela a été répondu dans ce post: État de l'application avec paramètre optionnel et aucune barre oblique finale

.state('path', {
    url: '/path/:param1',
    params: {
        param1: {
            value: null,
            squash: true
        }
    },
    views: {
        'map-tab': {
            templateUrl: 'templates/map.html',
            controller: 'testCtrl'
        }
    }
})
0
répondu oyaebunterkrah 2017-05-23 10:31:10