As rotas angularjs podem ter valores de parâmetros opcionais?


166

Posso definir uma rota com parâmetros opcionais (mesmo modelo e controlador, mas alguns parâmetros devem ser ignorados se não existirem?

Então, em vez de escrever as duas regras a seguir, tenha apenas uma?

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

Algo assim ([este parâmetro é opcional])

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

Não encontrei nada na documentação deles.


eles serão ignorados (sem []) na versão 1.1.5.
OZ_

realmente? Estou no 1.1.5, tentei com o código [: userId] e não os ignore.
Alexandru R

tente sem []. Veja este commit: github.com/angular/angular.js/commit/…
OZ_

opa, desculpe, trata-se de $ resource, não tenho certeza se funcionará no roteamento. Desculpe-me.
OZ_

1
Se a resposta do g-orge for boa, marque-a para que as pessoas não precisem rolar a lista toda para encontrar a melhor resposta?
AlexStack

Respostas:


243

Parece que o Angular tem suporte para isso agora.

Dos documentos mais recentes (v1.2.0) para $routeProvider.when(path, route):

pathpode conter grupos nomeados opcionais com um ponto de interrogação ( :name?)


7
Alguma maneira de evitar o uso da barra final? Se minha rota for: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...não corresponderá se o URL não tiver uma barra final. Então /claims/documents/1234/combina, mas /claims/documents/1234não combina .
James Bell

1
Gostaria de saber se alguém tem uma solução para o problema relatado por @JamesBell
Leiko #

5
A partir do Angular 1.3, o problema de barra final mencionado nos comentários acima foi corrigido. Navegar para / declarações / documentos / 1234 / funciona corretamente, assim como / declarações / documentos / 1234. Em suma, funciona com ou sem a barra à direita.
Judah Gabriel Himango

1
Ainda estou vendo esse comportamento se tiver um parâmetro opcional na minha rota. Por exemplo: se a rota for: '/: classificação? / Package / compare' e eu tento navegar até o URL "/ package / compare" que funciona. Se eu tentar '/ package / compare /' por algum motivo, obtenho o código ASCI anexado à classificação ou '/% 3f / package / compare', que não é uma rota real.
precisa saber é o seguinte

A documentação é confusa.
Oliver Dixon

59

Como a menção @ g-eorge, você pode fazer assim:

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

Você também pode fazer o quanto precisar de parâmetros opcionais.



2

Na verdade, acho que OZ_ pode estar um pouco correto.

Se você possui a rota '/users/:userId'e navega para '/users/'(observe o /), $routeParamsno seu controlador deve haver um objeto que contenha userId: ""em 1.1.5. Portanto, o paramater userIdnão é completamente ignorado, mas acho que é o melhor que você conseguirá.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.