Não é possível obter parâmetros de estado do roteador da interface do usuário
-
21-12-2019 - |
Pergunta
Considere a seguinte configuração do roteador ui:
$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"
}
}
})
Tenho o seguinte link no meu aplicativo:
<a ui-sref="app.feed({ feedId: 5 })">My Link</a>
Estou tentando conseguir o feedId
em parâmetros de estado:
angular.module('MyApp').controller('FeedCtrl', function($state) {
console.log($state.params);
});
Mas infelizmente, $state.params
é sempre {}
.
O que estou fazendo de errado?
PERGUNTA BÔNUS
eu espero FeedCtrl
para ser inicializado toda vez que eu clicar no link, ou seja,toda vez que o estado é alterado para app.feed
.Então, se eu mudar entre app.feed
estado e algum outro estado várias vezes, espero que o console.log
acima para ser executado várias vezes.Mas parece que o ui-router inicializa FeedCtrl
apenas uma vez.Por que?
Solução
Para passar um parâmetro - temos que defini-lo:
.state('app.feed', {
url: "/feed/{feedId}",
views: {
'menuContent': {
templateUrl: "templates/feed.html",
controller: "FeedCtrl"
}
}
Neste caso definimos como {feedId}
Veja mais aqui
Alguns exemplos:
'/user/{id:[^/]*}'
- Igual a'/user/{id}'
do exemplo anterior.'/user/{id:[0-9a-fA-F]{1,8}}'
- Semelhante ao exemplo anterior, mas corresponde apenas se o parâmetro id consistir de 1 a 8 dígitos hexadecimais.'/files/{path:.*}'
- Corresponde a qualquer URL começando com '/files/' e captura o resto do caminho no parâmetro 'path'.'/files/*path'
- Idem.Sintaxe especial para pegar tudo.
Caso tenhamos parâmetros definidos, navegaremos entre estados com diferentes feedId
valores...realmente veremos que esse controlador FeedCtrl
é reinstaurado.É assim que o ui-router
foi designado