在状态导航时更新rootScope变量

时间:2015-11-07 12:08:25

标签: javascript angularjs angularjs-scope angular-ui-router state

我有许多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状态定义中添加此类信息,以便我可以在模板中访问,那也没关系。 谢谢:))

1 个答案:

答案 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工厂/服务中。