Чи можуть маршрути 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] і не ігнорує їх.
Олександру Р

спробуйте без []. Дивіться цю комісію
OZ_

oops, вибачте, мова йде про $ resource, не впевнений, чи буде він працювати в маршрутизації. перепрошую.
OZ_

1
Якщо відповідь g-orge хороша, чи можете ви позначити її так, що людям не доведеться прокручувати все, щоб знайти найкращу відповідь?
AlexStack

Відповіді:


243

Схоже, зараз Angular має підтримку для цього.

З останніх (v1.2.0) документів для $routeProvider.when(path, route):

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


7
Будь-який спосіб уникнути використання косою косою рисою? Якщо мій маршрут такий: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...він не збігатиметься, якщо в URL-адресі немає кінцевої косої риски. Отже, /claims/documents/1234/збігається, але /claims/documents/1234ні.
Джеймс Белл

1
Хотілося б знати , якщо хто має рішення проблеми повідомили @JamesBell
Лейко

5
Станом на Кутовий 1.3, виправлена ​​проблема косої косої лінії, згадана у вищезазначених коментарях. Навігація до / претензії / документи / 1234 / працює правильно, як і / претензії / документи / 1234. Коротше кажучи, він працює з кінцевою косою рисою або без неї.
Іуда Габріель Хіманго

1
Я все ще бачу цю поведінку, якщо в маршруті є необов'язковий параметр. Наприклад: якщо маршрут є: '/: класифікація? / Пакет / порівняти', і я намагаюся перейти до URL-адреси "/ пакет / порівняти", він працює. Якщо я спробую '/ package / порівняти /' з якихось причин, я отримую код asci, доданий до класифікації, або "/% 3f / package / порівняння", який не є фактичним маршрутом.
ruby_newbie

Документація заплутана.
Олівер Діксон

59

Як і згадка @ g-eorge, ви можете зробити так:

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

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


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

2

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

Якщо у вас є маршрут '/users/:userId'і перейдіть до '/users/'(зверніть увагу на контур /), $routeParamsу вашому контролері повинен бути об'єкт, що міститься userId: ""в 1.1.5. Тож жоден параметр userIdне повністю ігнорується, але я думаю, що це найкраще, що ти збираєшся отримати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.