¿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.


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


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.



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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.