No se pueden obtener los parámetros de estado del enrutador UI
-
21-12-2019 - |
Pregunta
Considere la siguiente configuración de enrutador de interfaz de usuario:
$stateProvider
.state('app', {
url: "/app",
abstract: true,
templateUrl: "templates/menu.html",
controller: 'AppCtrl'
})
.state('app.feed', {
url: "/feed",
views: {
'menuContent': {
templateUrl: "templates/feed.html",
controller: "FeedCtrl"
}
}
})
Tengo el siguiente enlace en mi aplicación:
<a ui-sref="app.feed({ feedId: 5 })">My Link</a>
Estoy tratando de conseguir el feedId
en parámetros de estado:
angular.module('MyApp').controller('FeedCtrl', function($state) {
console.log($state.params);
});
Pero desafortunadamente, $state.params
es siempre {}
.
¿Qué estoy haciendo mal?
PREGUNTA EXTRA
Espero FeedCtrl
para inicializarse cada vez que hago clic en el enlace, es decircada vez que el estado cambia a app.feed
.Entonces, si cambio entre app.feed
estado y algún otro estado varias veces, espero que el console.log
arriba para ejecutarse varias veces.Pero parece que el ui-router se inicializa FeedCtrl
sólo una vez.¿Por qué?
Solución
Para pasar un parámetro, tenemos que definirlo:
.state('app.feed', {
url: "/feed/{feedId}",
views: {
'menuContent': {
templateUrl: "templates/feed.html",
controller: "FeedCtrl"
}
}
En este caso lo definimos como {feedId}
Ver más aquí
Algunos ejemplos:
'/user/{id:[^/]*}'
- Igual que'/user/{id}'
del ejemplo anterior.'/user/{id:[0-9a-fA-F]{1,8}}'
- Similar al ejemplo anterior, pero solo coincide si el parámetro id consta de 1 a 8 dígitos hexadecimales.'/files/{path:.*}'
- Coincide con cualquier URL que comience con '/files/' y captura el resto de la ruta en el parámetro 'ruta'.'/files/*path'
- Lo mismo.Sintaxis especial para capturar todo.
En caso de que tengamos parámetros definidos, navegaremos entre estados con diferentes feedId
valores...realmente veremos, que ese controlador FeedCtrl
se reinstancia.Así es como el ui-router
fue diseñado