我有许多UI-Router状态,并且在每个路由器的控制器中,我将一个上下文对象附加到rootScope,指定当该状态处于活动状态时隐藏或显示在全局导航栏上的内容。
$rootScope.context = { showSearch: true, hideBack: true }; // defaults
对于每个控制器,我有以下
function updateContext() {
$rootScope.context = undefined;
$rootScope = { showSearch: true, hideBack: true };
}
在nave模板中,我有以下
<nav>
<nav-search ng-show="context.showSearch"></nav-search>
<nav-back ng-hide="context.hideBack"></nav-back>
</nav>
这没关系,但问题是当一个人导航到state A
然后导航到state B
时,当用户返回状态A时,控制器不会再次“执行”并且所以上下文不会更新到A的上下文
我想知道如何解决这个问题。此外,如果可以在UI-Router状态定义中添加此类信息,以便我可以在模板中访问,那也没关系。 谢谢:))
答案 0 :(得分:0)
要走的路,我建议,是正确使用controller
/ $scope
生命周期。在创建过程中,我们设置值,在销毁过程中我们可以清理或重置之前的值。因此,要在代码中显示它,我们可以/应该这样做:
.controller('MyController', ['$scope', '$rootScope', function($scope, $rootScope) {
// keep what was set
var oldValues = {
showSearch: $rootScope.showSearch || true,
hideBack: $rootScope.hideBack || true,
};
...
// do some magic
...
// reset on state / view leave
$scope.$on('$destroy', function(){
$rootScope.showSearch = oldValues.showSearch;
$rootScope.hideBack = oldValues.hideBack ;
});
}])
顺便说一句:与
$rootScope
合作就像使用其他任何单身人士一样。所以,也许 - 将所有内容从 $ rootScope 移到一些自定义的StateHolder
工厂/服务中。