AngularJS la interfaz de usuario del Router obtener el estado actual de dentro de una vista

StackOverflow https://stackoverflow.com//questions/25040304

  •  21-12-2019
  •  | 
  •  

Pregunta

Teniendo en cuenta los siguientes estados tomado de la interfaz de usuario de la documentación del router:

.state('state1', {
  url: '/state1',
  templateUrl: 'partials/state1.html'
  controller: 'State1Ctrl'
})
.state('state1.list', {
  url: '/list',
  templateUrl: 'partials/state1.list.html',
})

Y el controlador "partials/state1.html" para el estado "estado1":

.controller('State1Ctrl', function () {

});

¿Hay alguna característica integrada para determinar desde dentro del controlador o dentro de la plantilla, de qué estado de la controladora/plantilla asociada con?

Por ejemplo:

.controller('State1Ctrl', function ($state) {
  console.log($state.this); // state1
});

Y si no hay solución integrada, ¿cómo se "decorar" $estado o de $stateParams, para contener esta información?

La única solución que he encontrado es usar $estado.get() y, a continuación, encontrar el estado con el controlador o una plantilla de valor.Este parece ser increíblemente complicado, sin embargo.

¿Fue útil?

Solución

No se pudo encontrar esto documentado en ningún lugar, así que miré en el código fuente.

Hay un campo de datos llamado $ UIView adjunto al elemento Vista de usuario, contiene el nombre de la vista y el estado asociado.Puede obtener este estado como este:

elem.closest('[ui-view]').data('$uiView').state

o incluso

elem.inheritedData('$uiView').state

Otros consejos

Puede acceder al objeto de configuración de estado actual como este:

$state.current

Para obtener más información, eche un vistazo a la $ documentación estatal .

Puede hacerlo de la siguiente manera,

$state.current.name //Return the name of current state

Podemos ver ¿ se define por current estado, mediante la $state.current, revise este ejemplo mostrando:

state1
{
  "url": "/state1",
  "template": "<div>state1 <pre>{{current | json }}</pre><div ui-view=\"\"></div> </div>",
  "controller": "State1Ctrl",
  "name": "state1"
}
list
{
  "url": "/list",
  "template": "<div>list <pre>{{current | json }}</pre></div>",
  "controller": "State1Ctrl",
  "name": "state1.list"
}

el controlador:

.controller('State1Ctrl', function($scope, $state) {

  $scope.current = $state.current

});

compruebe que aquí

AMPLIAR:El ejemplo de arriba siempre devolverá estado actual - es decir,si no es la jerarquía de los tres estados y accedemos a la última del estado ('state1.list.detail') directamente:

<a ui-sref="state1.list.detail({detailId:1})">....

Cada controlador será proporcionado con el mismo estado:$estado("estado1.lista.detalle").

Por qué?beause este estado tiene suficiente información como lo son todos los puntos de vista (jerárquicamente anidada) y sus controladores necesarios.Podemos observar que todos en el

$state.$current // not .current

Rápidamente discute aquí citar:

Además, los usuarios pueden adjuntar personalizado decoradores, lo que generará nuevas propiedades en el estado interno de definición.Actualmente no existe un claro caso de uso para el que esta más allá de acceso interno de los estados (es decir, $state.$current), sin embargo, esperamos que esto se convierta cada vez más relevante a medida que introducimos adicional de meta-programación de funciones.

PERO:NO hay manera, cómo obtener información de actual controlador de instance, a la que $state pertenece!Incluso cualquier iteraciones, buscando a través de algunos $state.get('stateName') ser poco fiable, porque simplemente no hay mantienen relación de esa manera.Un controlador Class podría ser utilizado para muchas opiniones diferentes Instances.Y también, desde mi experiencia, yo no recuerdo ningún caso, cuando yo necesitaba saber esa información...deseo ahora es un poco más claro

Esto es útil si está buscando el nombre actual del estado, $ State.Current.Name

No estoy seguro de que sea la misma versión, pero en 0.3.1 puede usar esto para obtener el estado actual:

$state.$current.name

y para realizar un cheque:

$state.is('contact.details.item');

Documentación: https:// ui-Router.github.io/ng1/docs/0.3.1/index.html#/api/ui.router.state . $ Estado

un controlador " fuera de la caja" de su código, que muestra el estado:

.controller('State1Ctrl', function ($state) {
    console.log("Current State: ", $state.current.name);
});

Si desea verificar el estado actual

console.log("state", $state.current)

Si desea verificar el nombre del nombre del estado actual

console.log("statename", $state.current.name)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top