Con ui-router
, es posible inyectar $state
o $stateParams
en un controlador para obtener acceso a los parámetros en la URL. Sin embargo, acceder a los parámetros a través de $stateParams
solo expone los parámetros que pertenecen al estado administrado por el controlador que accede a él, y sus estados principales, mientras que $state.params
tiene todos los parámetros, incluidos los de cualquier estado secundario.
Dado el siguiente código, si cargamos directamente la URL http://path/1/paramA/paramB
, así es como funciona cuando se cargan los controladores:
$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 pregunta es, ¿por qué la diferencia? ¿Y existen pautas de mejores prácticas sobre cuándo y por qué debe usar o evitar usar cualquiera de ellos?
angularjs
angular-ui-router
Merott
fuente
fuente
Respuestas:
La documentación reitera sus hallazgos aquí: https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service
Si no me falla la memoria,
$stateParams
se introdujo más tarde que el original$state.params
, y parece ser un simple ayudante inyector para evitar escribir continuamente$state.params
.Dudo que existan pautas de mejores prácticas, pero el contexto me gana. Si simplemente desea acceder a los parámetros recibidos en la URL, utilice
$stateParams
. Si desea saber algo más complejo sobre el estado en sí, utilice$state
.fuente
$state.params
inACtrl
, porque quería verificar siyetAnotherParam
está configurado. De modo que si no es así, puedo hacer algo. No voy a entrar en los detalles de ese algo, ya que podría justificar una pregunta propia. Sin embargo, creo que puedo estar haciendo un truco al verificar un parámetro introducido por un estado secundario y no reconocido por el estado actual a través de$stateParams
. Desde entonces he encontrado un enfoque alternativo.parent.child
, a continuación,$stateParams
enparentController
evaluará params basados en URL deparent
, pero no los deparent.child
. Vea este problema .$stateParams
funciona en resolución, mientras que$state.params
es incorrecta (no muestra parámetros para el estado que aún no se ha resuelto)Otra razón para usarlo
$state.params
es para el estado no basado en URL, que (en mi opinión) está lamentablemente poco documentado y es muy poderoso.Acabo de descubrir esto mientras buscaba en Google cómo pasar el estado sin tener que exponerlo en la URL y respondí una pregunta en otra parte de SO.
Básicamente, permite este tipo de sintaxis:
fuente
EDITAR: Esta respuesta es correcta para la versión
0.2.10
. Como señaló @Alexander Vasilyev, no funciona en la versión0.2.14
.Otra razón para usar
$state.params
es cuando necesita extraer parámetros de consulta como este:fuente
Hay muchas diferencias entre estos dos. Pero mientras trabajaba prácticamente he descubierto que usar
$state.params
mejor. Cuando usa más y más parámetros, esto puede resultar confuso de mantener$stateParams
. donde si usamos múltiples parámetros que no son parámetros de URL$state
es muy útilfuente
Tengo un estado de raíz que resuelve algo. Pasar
$state
como parámetro de resolución no garantizará la disponibilidad de$state.params
. Pero usando$stateParams
will.Usando "angular": "~ 1.4.0", "angular-ui-router": "~ 0.2.15"
fuente
Una observación interesante que hice al pasar los parámetros de estado anteriores de una ruta a otra es que $ stateParams se eleva y sobrescribe los parámetros de estado de la ruta anterior que se pasaron con los parámetros de estado actual, pero el uso de
$state.param
s no lo hace.Al usar
$stateParams
:Al usar $ state.params:
fuente
Aquí en este artículo se explica claramente: El
$state
servicio proporciona una serie de métodos útiles para manipular el estado, así como los datos pertinentes sobre el estado actual. Los parámetros del estado actual son accesibles en el$state
servicio en la tecla params. El$stateParams
servicio devuelve este mismo objeto. Por lo tanto, el$stateParams
servicio es estrictamente un servicio de conveniencia para acceder rápidamente al objeto params en el$state
servicio.Como tal, ningún controlador debería inyectar tanto el
$state
servicio como su servicio de conveniencia$stateParams
. Si$state
se está inyectando solo para acceder a los parámetros actuales, el controlador debe reescribirse para inyectar en su$stateParams
lugar.fuente