我创建了一个应用程序是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);
}
};
});
答案 0 :(得分:5)
我已经纠正过了。工作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);
}
};
});
答案 1 :(得分:3)
scope: {},
您使用隔离范围。它不从父作用域继承,因此在此作用域中不存在name
。由于您直接在$rootScope
中定义它,因此您可以在指令中访问它:
module.directive("tree", function($compile, $rootScope) {
...
link : function(scope, elm, $attrs) {
function update()
{
};
$rootScope.$watch('name', function(newVal, oldVal) {
使用根范围不是最好的主意。我不会将name
放入根范围开始。最好将它放入控制器的范围并使用绑定,类似于@simon提出的解决方案。