¿Pueden las rutas angularjs tener valores de parámetros opcionales?

166

¿Puedo establecer una ruta con parámetros opcionales (misma plantilla y controlador, pero algunos parámetros deben ignorarse si no existen?

Entonces, en lugar de escribir las siguientes dos reglas, ¿tiene solo una?

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

Algo como esto ([este parámetro es opcional])

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

No pude encontrar nada en su documentación.

Alexandru R
fuente
serán ignorados (sin []) en la versión 1.1.5.
OZ_
¿De Verdad? Estoy en 1.1.5, probé con el código [: userId] y no los ignoro.
Alexandru R
sin tratar []. Vea este compromiso: github.com/angular/angular.js/commit/…
OZ_
oops, lo siento, se trata de $ resource, no estoy seguro de si funcionará en el enrutamiento. Perdóneme.
OZ_
1
Si la respuesta de g-orge es buena, ¿podría marcarla para que las personas no tengan que desplazarse todo para encontrar la mejor respuesta?
AlexStack

Respuestas:

243

Parece que Angular tiene soporte para esto ahora.

De los últimos documentos (v1.2.0) para $routeProvider.when(path, route):

pathpuede contener grupos con nombre opcionales con un signo de interrogación ( :name?)

Jorge
fuente
77
¿Alguna forma de evitar usar la barra diagonal final? Si mi ruta es: .when('/claims/documents/:CLAIMS_ID/:DOCUMENT_NAME?'...no coincidirá si la url no tiene una barra inclinada final. Entonces /claims/documents/1234/coincide, pero /claims/documents/1234no lo hace.
James Bell
1
Me gustaría saber si alguien tiene una solución para el problema informado por @JamesBell
Leiko
55
A partir de Angular 1.3, se solucionó el problema de la barra diagonal final mencionada en los comentarios anteriores. Navegar a / reclamos / documentos / 1234 / funciona correctamente, al igual que / reclamos / documentos / 1234. En resumen, funciona con o sin la barra diagonal final.
Judá Gabriel Himango
1
Todavía veo este comportamiento si tengo un parámetro opcional en mi ruta. Por ejemplo: si la ruta es: '/: clasificación? / Paquete / comparar' e intento navegar a la url "/ paquete / comparar" funciona. Si intento '/ package / compare /' por alguna razón, obtengo el código ASCI adjunto a la clasificación, o '/% 3f / package / compare', que no es una ruta real.
ruby_newbie
La documentación es confusa.
Oliver Dixon
59

Como menciona @ g-eorge, puedes hacerlo así:

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

También puede hacer tanto como necesite parámetros opcionales.

zmilan
fuente
8

Consulte la respuesta de @jlareau aquí: /programming/11534710/angularjs-how-to-use-routeparams-in-generating-the-templateurl

Puede usar una función para generar la cadena de plantilla:

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
fuente
2

En realidad, creo que OZ_ puede ser algo correcto.

Si tiene la ruta '/users/:userId'y navega hacia '/users/'(tenga en cuenta el seguimiento /), $routeParamsen su controlador debe haber un objeto que contenga userId: ""en 1.1.5. Así que no, el paramater userIdno se ignora por completo, pero creo que es lo mejor que obtendrás.

Roy Daniels
fuente