AngularJS UI-Router从视图中获取当前状态

时间:2014-07-30 15:04:02

标签: angularjs angular-ui-router

考虑ui-router文档中的以下状态:

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

" partials / state1.html"的控制器for state" state1":

.controller('State1Ctrl', function () {

});

是否有任何内置功能可以在控制器内或模板内确定控制器/模板与哪种状态相关联?

例如:

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

如果没有内置解决方案,您将如何装饰" $ state或$ stateParams,包含这些信息?

我提出的唯一解决方案是使用$ state.get(),然后使用控制器或模板值查找状态。但这似乎非常混乱。

8 个答案:

答案 0 :(得分:58)

您可以像这样访问当前状态配置对象:

$state.current

有关详细信息,请查看$state documentation

答案 1 :(得分:30)

你可以按照以下方式进行,

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

答案 2 :(得分:9)

无法在任何地方找到此文档,因此我查看了源代码。

有一个名为$ uiView的数据字段附加到ui-view元素,它包含视图名称和关联状态。你可以这样得到这样的状态:

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

甚至

elem.inheritedData('$uiView').state

答案 3 :(得分:5)

我们可以使用 current 查看$state.current州定义的,查看此example显示:

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"
}

控制器:

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

  $scope.current = $state.current

});

检查here

EXTEND:上面的示例将始终返回当前状态 - 即,如果存在三个状态的层次结构,并且我们直接访问最后一个状态('state1.list.detail'):

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

每个控制器都将提供相同的状态:$ state(&#34; state1.list.detail&#34;)。

为什么呢?因为这个状态有足够的信息所有的视图(分层嵌套)及其所需的控制器。我们可以在

中观察到所有这些
$state.$current // not .current

快速讨论here 引用:

  

此外,用户可以附加自定义装饰器,这将在州内部定义中生成新属性。除了访问内部状态(即 $state.$current )之外,目前还没有明确的用例,但是,随着我们引入额外的元编程功能,预计这将变得越来越重要。

但是:没有办法,如何从当前控制器 instance获取信息,它属于$state!即使是任何迭代,搜索一些$state.get('stateName')都是不可靠的,因为只是没有保持关系的方式。一个控制器Class可以作为不同的Instances用于许多视图。而且,根据我的经验,我不记得任何情况,当我需要知道这些信息时...现在希望它更清楚

答案 4 :(得分:3)

如果您要查找当前状态名称$ state.current.name

,这非常有用

答案 5 :(得分:1)

不确定它是否是相同的版本,但在0.3.1上,您可以使用它来获取当前状态:

$state.$current.name

并进行检查:

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

文档: https://ui-router.github.io/ng1/docs/0.3.1/index.html#/api/ui.router.state。$状态

答案 6 :(得分:0)

如果要检查当前状态

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

如果要检查当前状态名称的名称

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

答案 7 :(得分:0)

代码中有效的“ 开箱即用” 控制器,显示状态:

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