AngularJS:当 $rootScope 值更改时,指令内的 $watch 不起作用

Posted

技术标签:

【中文标题】AngularJS:当 $rootScope 值更改时,指令内的 $watch 不起作用【英文标题】:AngularJS : $watch within directive is not working when $rootScope value is changed 【发布时间】:2015-01-31 15:50:52 【问题描述】:

我创建了一个应用程序是 angularjs,其中我有一个指令,当 $rootScope 变量发生变化时,我在指令中进行监视以触发指令中的某些方法,但问题是当 $ rootScope.name 值已更改,指令中的手表不起作用

我的代码如下所示

Working Demo

var module = angular.module('myapp', []);

module.controller("TreeCtrl", function($scope, $rootScope) 
    $scope.treeFamily = 
        name : "Parent"
    ;

    $scope.changeValue = function()
    
        $rootScope.name = $scope.userName;
    ;

);

module.directive("tree", function($compile) 
    return 
        restrict: "E",
        transclude: true,
        scope: ,
        template:'<div>sample</div>',
        link : function(scope, elm, $attrs) 
           function update()
           
           ;
           scope.$watch('name', function(newVal, oldVal) 
                console.log('calling');
               update();
            , true);
        
    ;
);

【问题讨论】:

【参考方案1】:
scope: ,

您使用隔离范围。它不是从父作用域继承的,所以name 不存在于这个作用域中。由于您直接在 $rootScope 中定义它,您可以在指令中访问它:

module.directive("tree", function($compile, $rootScope) 
    ...
    link : function(scope, elm, $attrs) 
       function update()
       
       ;
       $rootScope.$watch('name', function(newVal, oldVal) 

不过,使用根作用域并不是最好的主意。一开始我不会将name 放入根范围。最好放到控制器的作用域中使用绑定,类似于@simon 提出的方案。

【讨论】:

【参考方案2】:

我已经更正了。对于工作fiddle

<div ng-app="myapp">
  <div ng-controller="TreeCtrl">
    <input type="text" ng-model="userName"/>
    <button ng-click="changeValue()">Change</button>
    <tree name="name">
    </tree>
  </div>
</div>



module.directive("tree", function($compile) 
  return 
    restrict: "E",
    transclude: true,
    scope: 
        name: '='
    ,
    template:'<div>sample</div>',
    link : function(scope, elm, $attrs) 
       function update()
       
       ;
       scope.$watch('name', function(newVal, oldVal) 
            console.log('calling');
           update();
        , true);  
    
  ;
);

【讨论】:

你能告诉我这是我遇到的问题吗 你不能直接在指令中使用 rootscope。通过使用范围使用 2 方式绑定: name : '='

以上是关于AngularJS:当 $rootScope 值更改时,指令内的 $watch 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs [$rootScope:inprog] 进行中错误

Angularjs:为啥页面刷新会破坏 $rootScope 的值?

如何删除 angularjs 中的 $rootScope 变量? [复制]

AngularJS中Error: [$rootScope:inprog]的解决办法

错误:$rootScope:inprog 操作已经在进行中 mvc 与 angularjs

Angularjs 不呈现 $rootscope 数据