![](/img/trans.png)
[英]Angular-Ui-Router state changes but template URL doesn't load for nested states
[英]Observing state changes in angular-ui-router
据我了解,获取状态更改通知的常用方法是在$stateChangeStart
事件上进行回调,就像在这个答案中一样 。
但是,如果我理解正确,我还可以将$ state对象附加到当前作用域,如下所示:
myApp.controller('myAppCtrl', function($scope, $state) {
$scope.$state = $state;
}
据我所知,这可以直接从HTML模板中查看状态详细信息,例如(假设我的某些状态有一个布尔标志.isAdminOnlyState
设置为true,我希望在显示时将整个页面设置为红色) :
<body ng-class='{"everythingInRed": $state.current.data.isAdminOnlyState}'>
与具有监听功能相比,这种方法的优点和缺点是什么?
这取决于您是想要在全局还是在单个控制器/视图上处理某些内容,您所描述的方法适用于后者。 但是,在您发布的代码中,您需要确保myAppCtrl
在您的应用中始终处于活动状态,以便正确更新该ng-class
。 通过路由,您倾向于在给定时间点激活控制器,而不是始终。 有人可能会说,这是你贴的方法的缺点,如果你处理$state
改变事件的$rootScope
你可以把$state.current.data.isAdminOnlyState
在$rootScope
并已将其相应的更新。 把它放在根作用域上的一个缺点是(我想)会影响性能,因为对于调用处理程序的每个状态转换,并且执行处理程序内的代码,另一个缺点是通过放置$state.current.data.isAdminOnlyState
$rootScope
上的$state.current.data.isAdminOnlyState
污染了通常$state.current.data.isAdminOnlyState
的根范围。 话虽如此,如果您打算让myAppCtrl
处于活动状态,例如让它成为主页的某个部分的控制器,例如导航栏部分,则仍会在每个状态转换期间对其进行评估。
有些不相关:ui路由器有一个指令,可以在该代码片段中执行您想要的操作,请查看ui-sref-active
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.