AngularJS $监视更改的根范围变量

MCh*_*han 32 angularjs

我有以下$ rootScope变量,我用它来保存当前登录的用户权限级别,然后我从其他控制器访问此变量.有没有办法我可以观察rootScope变量的变化,以便更新控制器特定变量与根范围变量的任何更改?下面是我目前使用的代码,有人可以告诉我我做错了什么以及如何解决它?谢谢

在.run下的app.js中:

 $rootScope.uPLevel = 0;
Run Code Online (Sandbox Code Playgroud)

.controller

   $scope.$watch($rootScope.uPLevel, function() {
            $scope.userPLevel = $rootScope.uPLevel;
   }, true);
Run Code Online (Sandbox Code Playgroud)

Som*_*ens 54

第一个参数$watch应该是字符串或函数(docs).现在你传递$rootScope.uPLevel控制器初始化的值.

$scope.$watch(function() {
  return $rootScope.uPLevel;
}, function() {
  $scope.userPLevel = $rootScope.uPLevel;
}, true);
Run Code Online (Sandbox Code Playgroud)

两个旁注:

  • 将此值存储在服务中而不是存储可能是谨慎的$rootScope.
  • 如果uPLevel只是一个整数(如您的示例所示),那么您不需要传递true第三个参数 - 这仅适用于数组和对象.如果您确实想观看收藏,那么我建议您使用$watchCollection.

  • @ SomeKittensUx2666是对的,你应该拒绝把东西放在$ rootScope上,在这种情况下,我建议你从$ rootScope广播一个事件,所有控制器/服务都可以监听这个事件来处理变更逻辑. (3认同)

小智 27

我建议像这样观察$ rootScope变量:

$scope.$watch('$root.uPLevel', function() {
    $scope.userPLevel = $rootScope.uPLevel;
});
Run Code Online (Sandbox Code Playgroud)

这样,当前指令/控制器被销毁.它也清除了手表.在$ rootScope.$表壳中,手表永远保持不变.