Avec ui-router
, il est possible d'injecter l'un $state
ou l' autre $stateParams
dans un contrôleur pour accéder aux paramètres de l'URL. Cependant, l'accès aux paramètres via $stateParams
n'expose que les paramètres appartenant à l'état géré par le contrôleur qui y accède, ainsi qu'à ses états parents, alors qu'il $state.params
contient tous les paramètres, y compris ceux de n'importe quel état enfant.
Compte tenu du code suivant, si nous chargeons directement l'URL http://path/1/paramA/paramB
, voici comment cela se passe lorsque les contrôleurs se chargent:
$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
}
La question est, pourquoi la différence? Et existe-t-il des directives sur les meilleures pratiques concernant quand et pourquoi vous devriez utiliser ou éviter d'utiliser l'un ou l'autre?
angularjs
angular-ui-router
Merott
la source
la source
Réponses:
La documentation réitère vos conclusions ici: https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service
Si ma mémoire
$stateParams
est$state.params
bonne , a été introduit plus tard que l'original , et semble être un simple injecteur d'aide pour éviter d'écrire en continu$state.params
.Je doute qu'il y ait des lignes directrices sur les meilleures pratiques, mais le contexte l'emporte pour moi. Si vous souhaitez simplement accéder aux paramètres reçus dans l'url, utilisez
$stateParams
. Si vous voulez savoir quelque chose de plus complexe sur l'état lui-même, utilisez$state
.la source
$state.params
inACtrl
, car je voulais vérifier siyetAnotherParam
c'était défini. Si ce n'est pas le cas, je peux faire quelque chose. Je n'entrerai pas dans les détails de ce quelque chose, car cela pourrait justifier une question en soi. Cependant, je pense que je peux faire un hack en recherchant un paramètre qui est introduit par un état enfant et non reconnu par l'état actuel via$stateParams
. J'ai trouvé une approche alternative depuis.parent.child
, alors$stateParams
dansparentController
évaluera les paramètres basés sur l'url deparent
, mais pas ceux deparent.child
. Consultez ce numéro .$stateParams
fonctionne dans la résolution, alors que$state.params
c'est incorrect (ne montre pas les paramètres pour l'état qui n'est pas encore résolu)Une autre raison d'utiliser
$state.params
est l'état non basé sur une URL, qui (à mon avis) est malheureusement sous-documenté et très puissant.Je viens de découvrir cela en cherchant sur Google comment transmettre l'état sans avoir à l'exposer dans l'URL et j'ai répondu à une question ailleurs sur SO.
En gros, cela permet ce type de syntaxe:
la source
EDIT: Cette réponse est correcte pour la version
0.2.10
. Comme @Alexander Vasilyev l'a souligné, cela ne fonctionne pas dans la version0.2.14
.Une autre raison à utiliser
$state.params
est lorsque vous devez extraire des paramètres de requête comme celui-ci:la source
Il existe de nombreuses différences entre les deux. Mais en travaillant pratiquement, j'ai trouvé cela en utilisant
$state.params
mieux. Lorsque vous utilisez de plus en plus de paramètres, cela peut être difficile à gérer$stateParams
. où si nous utilisons plusieurs paramètres qui ne sont pas des paramètres d'URL$state
est très utilela source
J'ai un état racine qui résout qc. Passer en
$state
tant que paramètre de résolution ne garantira pas la disponibilité pour$state.params
. Mais en utilisant la$stateParams
volonté.Utilisation de "angular": "~ 1.4.0", "angular-ui-router": "~ 0.2.15"
la source
Une observation intéressante que j'ai faite en passant des paramètres d'état précédents d'une route à une autre est que $ stateParams est hissé et écrase les paramètres d'état de la route précédente qui ont été passés avec les paramètres d'état actuels, mais l'utilisation de
$state.param
s ne le fait pas.Lors de l'utilisation
$stateParams
:Lors de l'utilisation de $ state.params:
la source
Ici, dans cet article est clairement expliqué: Le
$state
service fournit un certain nombre de méthodes utiles pour manipuler l'état ainsi que des données pertinentes sur l'état actuel. Les paramètres de l'état actuel sont accessibles sur le$state
service au niveau de la touche params. Le$stateParams
service renvoie ce même objet. Par conséquent, le$stateParams
service est strictement un service de commodité pour accéder rapidement à l'objet params sur le$state
service.En tant que tel, aucun contrôleur ne devrait jamais injecter à la fois le
$state
service et son service de commodité$stateParams
. Si le$state
est injecté uniquement pour accéder aux paramètres actuels, le contrôleur doit être réécrit pour injecter à la$stateParams
place.la source