Com o ui-router
, é possível injetar $state
ou $stateParams
em um controlador para obter acesso aos parâmetros na URL. No entanto, acessar parâmetros por meio de $stateParams
expõe apenas os parâmetros pertencentes ao estado gerenciado pelo controlador que o acessa, e seus estados pais, enquanto $state.params
possui todos os parâmetros, incluindo aqueles em quaisquer estados filho.
Dado o código a seguir, se carregarmos diretamente a URL http://path/1/paramA/paramB
, é assim que acontece quando os controladores são carregados:
$stateProvider.state('a', {
url: 'path/:id/:anotherParam/',
controller: 'ACtrl',
});
$stateProvider.state('a.b', {
url: '/:yetAnotherParam',
controller: 'ABCtrl',
});
module.controller('ACtrl', function($stateParams, $state) {
$state.params; // has id, anotherParam, and yetAnotherParam
$stateParams; // has id and anotherParam
}
module.controller('ABCtrl', function($stateParams, $state) {
$state.params; // has id, anotherParam, and yetAnotherParam
$stateParams; // has id, anotherParam, and yetAnotherParam
}
A questão é: por que a diferença? E há diretrizes de práticas recomendadas sobre quando e por que você deve usar ou evitar usar qualquer um deles?
angularjs
angular-ui-router
Merott
fonte
fonte
Respostas:
A documentação reitera suas descobertas aqui: https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service
Se não me falha a memória,
$stateParams
foi apresentado depois do original$state.params
e parece ser um simples auxiliar injetor para evitar a escrita contínua$state.params
.Duvido que haja diretrizes de melhores práticas, mas o contexto vence para mim. Se você simplesmente deseja acessar os parâmetros recebidos na url, use
$stateParams
. Se você quiser saber algo mais complexo sobre o próprio estado, use$state
.fonte
$state.params
inACtrl
, porque queria verificar seyetAnotherParam
está definido. Então, se não for, posso fazer alguma coisa. Não vou entrar nos detalhes de que algo como isso poderia justificar uma questão de sua própria. No entanto, sinto que posso estar fazendo um hack , verificando se há um parâmetro introduzido por um estado filho e não reconhecido pelo estado atual por meio de$stateParams
. Eu encontrei uma abordagem alternativa desde então.parent.child
, então$stateParams
emparentController
irá avaliar os parâmetros baseados em url deparent
, mas não os deparent.child
. Veja esta edição .$stateParams
funciona em resolução, enquanto$state.params
está incorreto (não mostrando parâmetros para estado que ainda não foi resolvido)Outra razão para usar
$state.params
é para o estado não baseado em URL, que (na minha opinião) é lamentavelmente mal documentado e muito poderoso.Acabei de descobrir isso enquanto pesquisava no Google sobre como passar o estado sem precisar expô-lo na URL e respondi a uma pergunta em outro lugar no SO.
Basicamente, ele permite este tipo de sintaxe:
fonte
EDIT: Esta resposta está correta para a versão
0.2.10
. Como @Alexander Vasilyev apontou, não funciona na versão0.2.14
.Outro motivo para usar
$state.params
é quando você precisa extrair parâmetros de consulta como este:fonte
Existem muitas diferenças entre os dois. Mas enquanto trabalho praticamente descobri que usar
$state.params
melhor. Quando você usa mais e mais parâmetros, pode ser confuso mantê-los$stateParams
. onde se usarmos vários parâmetros que não são parâmetros de URL$state
é muito útilfonte
Eu tenho um estado de raiz que resolve o sth. Passar
$state
como um parâmetro de resolução não garante a disponibilidade de$state.params
. Mas usando$stateParams
vontade.Usando "angular": "~ 1.4.0", "angular-ui-roteador": "~ 0.2.15"
fonte
Uma observação interessante que fiz ao passar parâmetros de estado anteriores de uma rota para outra é que $ stateParams é içado e sobrescreve os parâmetros de estado da rota anterior que foram passados com os parâmetros de estado atuais, mas o uso de
$state.param
s não.Ao usar
$stateParams
:Ao usar $ state.params:
fonte
Aqui neste artigo é explicado claramente: O
$state
serviço fornece uma série de métodos úteis para manipular o estado, bem como dados pertinentes sobre o estado atual. Os parâmetros do estado atual são acessíveis no$state
serviço na chave params. O$stateParams
serviço retorna esse mesmo objeto. Portanto, o$stateParams
serviço é estritamente um serviço de conveniência para acessar rapidamente o objeto params no$state
serviço.Dessa forma, nenhum controlador deve injetar o
$state
serviço e seu serviço de conveniência$stateParams
,. Se o$state
estiver sendo injetado apenas para acessar os parâmetros atuais, o controlador deve ser reescrito para injetar$stateParams
.fonte