【问题标题】:AngularJS $watch root scope variable for changesAngularJS $watch 根范围变量进行更改
【发布时间】:2014-03-29 23:55:34
【问题描述】:

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

在app.js下.run:

 $rootScope.uPLevel = 0;

.控制器

   $scope.$watch($rootScope.uPLevel, function() {
            $scope.userPLevel = $rootScope.uPLevel;
   }, true);

【问题讨论】:

    标签: angularjs


    【解决方案1】:

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

    $scope.$watch(function() {
      return $rootScope.uPLevel;
    }, function() {
      $scope.userPLevel = $rootScope.uPLevel;
    }, true);
    

    两个旁注:

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

    【讨论】:

    • 非常感谢,我之所以在 rootScope 中使用它,是因为我需要一种方法可以从应用程序范围内的所有服务/控制器访问它。你认为在服务中包含这个变量会更好吗?如果是,您能解释一下原因吗?
    • @MChan 将$rootScope 弄乱通常是个坏主意,原因与不将大量变量附加到window 的原因相同。需要考虑的事情。别忘了点赞!
    • @SomeKittensUx2666 是正确的,您应该拒绝将东西放在 $rootScope 上,在这种情况下,我建议您从 $rootScope 广播一个事件,所有控制器/服务都可以收听该事件以处理更改逻辑。
    • 或者您可以使用单个对象并将所有数据存储在其中。这样你就不会弄乱 $rootScope
    • 再加一票,因为如果您有一个动态值要观看,但在特定范围内没有很好地隔离,即使它在 $window 上,这也是一个好方法。
    【解决方案2】:

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

    $scope.$watch('$root.uPLevel', function() {
        $scope.userPLevel = $rootScope.uPLevel;
    });
    

    这样,当当前指令/控制器被销毁时。它也会清除手表。在 $rootScope.$watch 情况下,手表将永远存在。

    【讨论】:

    • 好主意。如果您正在寻找性能优化,这是完美的选择
    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 2014-01-24
    • 1970-01-01
    相关资源
    最近更新 更多