我有一个按钮可以切换管理员和客户端模式。我已经把它放在 rootscope 中,所以我可以在任何地方访问它。

我正在使用 angular-ui directive 进行切换。

我在这个模型上放了一块 watch 。但什么也没有发生。知道有什么问题吗?

.run(['$rootScope', '$state', '$stateParams', '$location',
     function ($rootScope, $state, $stateParams, $location) {

         $rootScope.projectMode = 'Client';

         $rootScope.$watch('projectMode', function(){
             var path = $location.path();
             alert("fire") //Only fire ones when the app starts
             if($rootScope.projectMode === 'Client'){
                 var current = 'client'
                 var replace = 'admin'
             } else {
                 var current = 'admin'
                 var replace = 'client'
             }
             var newUrl = path.replace(current, replace)
             $location.url(newUrl);
         })

    }])

这是我的看法。
<div class="btn-group">
  <button type="button" class="btn btn-default"  ng-model="projectMode" btn-radio="'Client'">Klient</button>
  <button type="button" class="btn btn-default"  ng-model="projectMode" btn-radio="'Admin'">Admin</button>
</div>
btn-radio 是用于切换的 angular-ui 指令。

我已经检查过 $rootScope.projectMode 正在改变。所以 $watch 一定有问题。

最佳答案

真正的问题是您 View 中的 projectModeprojectMode 上的 $rootScope 不同。这是人们在 Angular 中遇到的常见问题。

Angular 中的作用域是原型(prototype)。如果在当前作用域中找不到属性,则它会在该作用域的父级中查找具有相同名称的属性,依此类推,直到到达 $rootScope 。因此,当您的 View 初始化时, projectMode 可能是您在 $rootScope 上将其初始化的任何内容。

但是,一旦更改 projectMode 的值,它就会在名为 projectMode 的 Controller 作用域上创建一个新值,该值与 $rootScope.projectMode 不同。所以,你的 $watch 没有被触发是有道理的...... $rootScope 值没有改变,只有 Controller 范围的值在改变。

如果您想修复它,只需将 HTML 中的 projectMode 更改为 $root.projectMode 即可。 ( HTML 中的 $root 是您引用 $rootScope 的方式。)

关于javascript - $watch on rootscope 不起作用,有 Angular ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21731666/

10-13 06:46