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?