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

166

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

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

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

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

Александру Р
источник
они будут игнорироваться (без []) в версии 1.1.5.
OZ_
действительно? Я на 1.1.5, попробовал с кодом [: userId] и не игнорирует их.
Александру Р
попробуй без []. Смотрите этот коммит: github.com/angular/angular.js/commit/…
OZ_
ой, извините, речь идет о ресурсе $, не уверен, будет ли он работать в маршрутизации. прошу прощения.
OZ_
1
Если ответ g-orge хороший, отметьте его, чтобы людям не приходилось прокручивать все, чтобы найти лучший ответ?
AlexStack

Ответы:

243

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

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

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

г-eorge
источник
7
Любой способ избежать использования косой черты? Если мой маршрут такой: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...он не будет совпадать, если в URL нет косой черты. Так что /claims/documents/1234/совпадает, но /claims/documents/1234нет.
Джеймс Белл
1
Хотелось бы знать , если кто имеет решение проблемы сообщили @JamesBell
Лейко
5
Начиная с версии Angular 1.3, проблема косой черты, упомянутая в вышеприведенных комментариях, исправлена. Навигация к / претензиям / документам / 1234 / работает правильно, как и / претензиям / документам / 1234. Короче говоря, это работает с или без косой черты.
Иуда Габриэль Химанго,
1
Я все еще вижу это поведение, если у меня есть дополнительный параметр в моем маршруте. Например: если маршрут: «/: классификация? / Пакет / сравнить», и я пытаюсь перейти к URL «/ пакет / сравнить», он работает. Если по какой-то причине я пытаюсь использовать «/ package / compare /», я получаю код asci, добавленный к классификации, или «/% 3f / package / Compare», который не является действительным маршрутом.
ruby_newbie
Документация сбивает с толку.
Оливер Диксон
59

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

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

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

zmilan
источник
8

Пожалуйста, смотрите ответ @jlareau здесь: /programming/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:'/'});
    }
);
chrisjordanme
источник
2

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

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

Рой Дэниелс
источник