Czy trasy angularjs mogą mieć opcjonalne wartości parametrów?

166

Czy mogę ustawić trasę z opcjonalnymi parametrami (ten sam szablon i kontroler, ale niektóre parametry należy zignorować, jeśli nie istnieją?

Więc zamiast pisać poniższe dwie zasady, masz tylko jedną?

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

Coś takiego ([ten parametr jest opcjonalny])

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

Nie mogłem znaleźć niczego w ich dokumentacji.

Alexandru R
źródło
będą ignorowane (bez []) w wersji 1.1.5.
OZ_,
naprawdę? Jestem na 1.1.5, próbowałem z kodem [: userId] i nie ignoruję ich.
Alexandru R,
spróbuj bez []. Zobacz to zatwierdzenie: github.com/angular/angular.js/commit/ ...
OZ_.
Ups, przepraszam, chodzi o $ zasób, nie jestem pewien, czy zadziała w routingu. przepraszam.
OZ_,
1
Jeśli odpowiedź g-orge jest dobra, czy mógłbyś ją zaznaczyć, aby ludzie nie musieli przewijać całej rzeczy, aby znaleźć najlepszą odpowiedź?
AlexStack

Odpowiedzi:

243

Wygląda na to, że Angular obsługuje to teraz.

Z najnowszej (wersja 1.2.0) dokumentów dla $routeProvider.when(path, route):

pathmoże zawierać opcjonalne nazwane grupy ze znakiem zapytania ( :name?)

Jerzy
źródło
7
Czy jest jakiś sposób, aby uniknąć używania końcowego ukośnika? Jeśli moja trasa to: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...nie będzie pasować, jeśli adres URL nie ma końcowego ukośnika. Więc /claims/documents/1234/pasuje, ale /claims/documents/1234nie.
James Bell
1
Chciałbym wiedzieć, czy ktoś ma rozwiązanie problemu zgłoszonego przez @JamesBell
Leiko
5
Od wersji Angular 1.3 problem z końcowym ukośnikiem wspomniany w powyższych komentarzach został rozwiązany. Nawigacja do / reklamacje / dokumenty / 1234 / działa poprawnie, podobnie jak / reklamacje / dokumenty / 1234. Krótko mówiąc, działa z końcowym ukośnikiem lub bez niego.
Judah Gabriel Himango
1
Nadal widzę to zachowanie, jeśli mam opcjonalny parametr w mojej trasie. Na przykład: jeśli trasa to: „/: klasyfikacja? / Pakiet / porównaj” i spróbuję przejść do adresu URL „/ pakiet / porównaj”, to działa. Jeśli z jakiegoś powodu spróbuję „/ package / compare /”, otrzymuję kod asci dołączony do klasyfikacji lub „/% 3f / package / compare”, który nie jest rzeczywistą trasą.
ruby_newbie
Dokumentacja jest myląca.
Oliver Dixon
59

Podobnie jak wzmianka @ g-eorge, możesz zrobić to tak:

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

Możesz także zrobić tyle, ile potrzebujesz opcjonalnych parametrów.

zmilan
źródło
8

Zobacz odpowiedź @jlareau tutaj: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Możesz użyć funkcji do wygenerowania ciągu szablonu:

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
źródło
2

Właściwie myślę, że OZ_ może być nieco poprawne.

Jeśli masz trasę '/users/:userId'i nawigujesz do '/users/'(zwróć uwagę na końcowe /), $routeParamsw kontrolerze powinien znajdować się obiekt zawierający userId: ""w 1.1.5. Więc nie, parametr userIdnie jest całkowicie ignorowany, ale myślę, że to najlepsze, co dostaniesz.

Roy Daniels
źródło