Могут ли маршруты angularjs иметь необязательные значения параметров?

Могу ли я установить маршрут с дополнительными параметрами (тем же шаблоном и контроллером, но некоторые параметры следует игнорировать, если они не существуют?

Таким образом, вместо написания следующих двух правил, есть только одно?

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

Как то так ([этот параметр необязательный])

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

Я не мог найти ничего в их документации.

5 ответов

Решение

Похоже, что Angular поддерживает это сейчас.

Из последних (v1.2.0) документов для $routeProvider.when(path, route):

path может содержать необязательные именованные группы со знаком вопроса (:name?)

Как упоминание @g-eorge, вы можете сделать это так:

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

Вы также можете сделать столько, сколько вам нужно дополнительных параметров.

Пожалуйста, смотрите ответ @jlareau здесь: https://stackru.com/questions/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Вы можете использовать функцию для генерации строки шаблона:

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:'/'});
    }
);

На самом деле я думаю, что OZ_ может быть несколько правильным.

Если у вас есть маршрут '/users/:userId' и перейдите к '/users/' (обратите внимание на конечный /), $routeParams в вашем контроллере должен быть объект, содержащий userId: "" в 1.1.5. Так что не параматер userId не полностью игнорируется, но я думаю, что это лучшее, что вы получите.

@JamesBell Вы можете использовать опцию сквоша, как ответили в этом посте: состояние приложения с необязательным параметром и без косой черты

.state('path', {
    url: '/path/:param1',
    params: {
        param1: {
            value: null,
            squash: true
        }
    },
    views: {
        'map-tab': {
            templateUrl: 'templates/map.html',
            controller: 'testCtrl'
        }
    }
})
Другие вопросы по тегам