当(模型)值发生变化时,有一些关于刷新指令的SO帖子:
推荐的方法是在链接功能中的scope
上观看值:
link: function(scope, element, attrs) {
scope.$watch("typeId",function(newValue,oldValue) {
// This gets called when data changes.
});
}
鉴于递归指令的以下实施,<my-directive>
:
angular.module('Myapp').directive("MyDirective", function(RecursionHelper) {
return {
restrict: "E",
scope: {
data: '=data'
},
templateUrl: 'view.html',
compile: function(tElement, tAttributes) {
return RecursionHelper.compile(tElement, tAttributes);
}
};
});
...和RecursionHelper:
angular.module('Myapp').factory('RecursionHelper',
['$compile',
function($compile) {
var RecursionHelper = {
compile: function(tElement, tAttrs) {
var contents = tElement.contents().remove();
var compiledContents;
return {
post: function(scope, iElement, iAttrs) {
if (!compiledContents) {
compiledContents = $compile(contents);
}
compiledContents(scope, function(clone) {
iElement.append(clone);
});
},
pre: function(scope, iElement, iAttrs) { }
}
}
}
return RecursionHelper;
}]);
我可以将监听器添加到我的链接功能中:
angular.module('Myapp').factory('RecursionHelper',
['$compile','MyService',
function($compile, MyService) {
var RecursionHelper = {
compile: function(tElement, tAttrs) {
var contents = tElement.contents().remove();
var compiledContents;
return {
post: function(scope, iElement, iAttrs) {
if (!compiledContents) {
compiledContents = $compile(contents);
}
compiledContents(scope, function(clone) {
iElement.append(clone);
});
// The listener function.
scope.$watch(MyService.data,function(newValue,oldValue) {
// This gets called when data changes.
});
},
pre: function(scope, iElement, iAttrs) { }
}
}
}
return RecursionHelper;
}]);
我添加了一个服务MyService
,其中包含可能会更改的数据以及我正在侦听的数据。第一次呈现指令的调用是以main.html
:
<my-directive data="data"></my-directive>
调用指令的编译函数,最终呈现包含递归指令的模板view.html
:
<span ng-repeat="item in data.items">
<my-directive data="item"></my-directive>
</span>
由于<my-directive> data
属性具有隔离范围,因此每个嵌套指令都有自己的“沙盒”范围。
问题
$watch
被修改,我的MyService.data
函数也不会被调用。这是因为该指令具有隔离范围吗?$watch
函数被调用,触发重新编译的实际实现是什么? SO帖子只有console.log语句的注释,但我找不到任何关于再次呈现整个(root)指令的内容。