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

AngularJS:$rootScope值更改时,$watch in指令不起作用,angularjs,angularjs-directive,watch,angularjs-watch,Angularjs,Angularjs Directive,Watch,Angularjs Watch,我创建了一个应用程序angularjs,其中我有一个指令,我在指令中移动了一个手表,当$rootScope变量发生变化时,触发指令中的一些方法,但问题是$rootScope.name值发生变化时,指令中的手表不起作用 我的代码如下所示 var module = angular.module('myapp', []); module.controller("TreeCtrl", function($scope, $rootScope) { $scope.treeFamily = {

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

我的代码如下所示

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);
        }
    };
});
var module=angular.module('myapp',[]);
module.controller(“TreeCtrl”,函数($scope,$rootScope){
$scope.treeFamily={
姓名:“家长”
};
$scope.changeValue=函数()
{
$rootScope.name=$scope.userName;
};
});
指令(“树”,函数($compile){
返回{
限制:“E”,
是的,
作用域:{},
模板:'sample',
链接:函数(范围、elm、$attrs){
函数更新()
{
};
作用域:$watch('name',函数(newVal,oldVal){
console.log('calling');
更新();
},对);
}
};
});

我已经纠正了它。工作


改变
指令(“树”,函数($compile){
返回{
限制:“E”,
是的,
范围:{
名称:'='
},
模板:'sample',
链接:函数(范围、elm、$attrs){
函数更新()
{
};
作用域:$watch('name',函数(newVal,oldVal){
console.log('calling');
更新();
},对);
}
};
});
您使用一个独立的作用域。它不从父作用域继承,因此
name
在此作用域中不存在。由于您直接在
$rootScope
中定义它,因此您可以在指令中访问它:

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

不过,使用根作用域并不是最好的主意。首先,我不会将
name
放入根范围。最好将其放入控制器的作用域并使用绑定,类似于@simon提出的解决方案。

您能告诉我我是什么问题吗?您不能直接使用rootscope inside指令。使用作用域:{name:'='}使用双向绑定
scope: {},
module.directive("tree", function($compile, $rootScope) {
    ...
    link : function(scope, elm, $attrs) {
       function update()
       {
       };
       $rootScope.$watch('name', function(newVal, oldVal) {