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.


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?)


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.



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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.