¿Es posible tener un parámetro de ruta opcional en la ruta Angular 2? Probé la sintaxis Angular 1.x en RouteConfig pero recibí el siguiente error:
"EXCEPCIÓN ORIGINAL: Ruta" / usuario /: id? "Contiene"? "Que no está permitido en una configuración de ruta".
@RouteConfig([
{
path: '/user/:id?',
component: User,
as: 'User'
}])
javascript
angular
Jeroen
fuente
fuente
RouteParams
no importar a componentes, verifique esto: stackoverflow.com/a/36792261/806202 . La solución es usarActivatedRoute
:route.snapshot.params['routeParam']
De esta forma, el componente no se vuelve a representar cuando se agrega el parámetro.
fuente
pathMatch: 'full'
para redirigir, de lo contrario, las rutas comousers/admin
también se redirigen en mi caso/users/all
o/users/home
lea 'todo' o 'inicio' como elid
y simplemente ignórelo si coincide con su valor mágico. Entonces la primera línea de arriba se convierteredirectTo: 'users/home'
o lo que sea que decidas. Para mí, un corte final realmente se destaca como algo incorrecto.Se recomienda utilizar un parámetro de consulta cuando la información es opcional.
de https://angular.io/guide/router#optional-route-parameters
Solo necesita sacar el parámetro de la ruta de la ruta.
fuente
Angular 4: solución para abordar el orden del parámetro opcional:
HACER ESTO:
Tenga en cuenta que las rutas
products
yproducts/:id
se nombran exactamente igual. Angular 4 seguirá correctamente lasproducts
rutas sin parámetro, y si es un parámetro, seguiráproducts/:id
.Sin embargo, la ruta para la ruta sin parámetros no
products
debe tener una barra inclinada final; de lo contrario, angular la tratará incorrectamente como una ruta de parámetros. Entonces, en mi caso, tuve la barra inclinada final para los productos y no estaba funcionando.NO HAGAS ESTO:
fuente
data
al componente, que puede ser diferente para cada ruta incluso al mismo componente. Se{path: 'products', component: ProductsComponent, data: { showAllProducts: true} },
podría usar un ejemplo y luego lo verificaráshowAllProducts
. Un poco más agradable que buscar un valor nulo, pero para los casos más simples, probablemente esté bien.La respuesta de Rerezz es bastante agradable, pero tiene una falla grave. Hace que el
User
componente vuelva a ejecutar elngOnInit
método.Puede ser problemático cuando haces cosas pesadas allí y no quieres que se vuelva a ejecutar cuando cambias de la ruta no paramétrica a la paramétrica. Aunque esas dos rutas están destinadas a imitar un parámetro de url opcional, no se convierten en 2 rutas separadas.
Esto es lo que sugiero para resolver el problema:
Luego puede mover la lógica responsable de manejar el parámetro al
UserWithParam
componente y dejar la lógica base en elUser
componente. Lo que hagasUser::ngOnInit
no se volverá a ejecutar cuando navegues de / user a / user / 123 .No se olvide de poner el
<router-outlet></router-outlet>
de laUser
plantilla 's.fuente
Las respuestas sugeridas aquí, incluida la respuesta aceptada de rerezz que sugiere agregar múltiples entradas de ruta funcionan bien.
Sin embargo, el componente se volverá a crear al cambiar entre las entradas de ruta, es decir, entre la entrada de ruta con el parámetro y la entrada sin el parámetro.
Si desea evitar esto, puede crear su propio emparejador de ruta que coincida con ambas rutas:
Luego use el matcher en su configuración de ruta:
fuente
Con angular4 solo necesitamos organizar las rutas juntas en jerarquía
Esto funciona para mi. De esta forma, el enrutador sabe cuál es la siguiente ruta en función de los parámetros de ID de opción.
fuente
Me encontré con otra instancia de este problema, y en la búsqueda de una solución llegó aquí. Mi problema era que estaba haciendo a los niños y cargando de forma diferida los componentes también para optimizar un poco las cosas. En resumen, si eres perezoso cargando el módulo principal. Lo principal fue que usé '/: id' en la ruta, y son quejas de que '/' sea parte de ella. No es el problema exacto aquí, pero se aplica.
Enrutamiento de aplicaciones del padre
Rutas secundarias cargadas perezosas
fuente
No puedo comentar, pero en referencia a: Angular 2 parámetro de ruta opcional
una actualización para Angular 6:
Consulte https://angular.io/api/router/ActivatedRoute para obtener información adicional sobre el enrutamiento de Angular6.
fuente
Ante un problema similar con la carga diferida, he hecho esto:
Y luego en el componente:
De esta manera:
La ruta sin
/
se redirige a la ruta con. Debido a estopathMatch: 'full'
, solo se redirige dicha ruta completa específica.Entonces,
users/:id
se recibe. Si la ruta real fueusers/
,id
es""
, así que regístresengOnInit
y actúe en consecuencia; de lo contrario,id
es la identificación y proceder.El resto del componente actúa sobre
selectedUser
o no indefinido (* ngIf y cosas así).fuente