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.

Alexandru R
fonte
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?)

g-eorge
fonte
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.

zmilan
fonte
8

Consulte a resposta @jlareau aqui: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Você pode usar uma função para gerar a sequência do modelo:

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
fonte
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á.

Roy Daniels
fonte