这个
答案解释并解决了所有问题,以下是最重要的部分:
当制作树形视图时,最好的解决方案是使用递归指令。然而,当你制作这样一个指令时,你会发现AngularJS进入了无限循环。
解决方法是让指令在编译事件期间删除元素,并在链接事件中手动编译和添加它们。
我在
这个主题中发现了这个功能,并将其
抽象成一个服务。
module.factory('RecursionHelper', ['$compile', function($compile){
return {
compile: function(element, link){
if(angular.isFunction(link)){
link = { post: link };
}
var contents = element.contents().remove();
var compiledContents;
return {
pre: (link && link.pre) ? link.pre : null,
post: function(scope, element){
if(!compiledContents){
compiledContents = $compile(contents);
}
compiledContents(scope, function(clone){
element.append(clone);
});
if(link && link.post){
link.post.apply(null, arguments);
}
}
};
}
};
}]);
使用此服务,您可以轻松地创建树指令(或其他递归指令)。以下是一个树指令的示例:
module.directive("tree", function(RecursionHelper) {
return {
restrict: "E",
scope: {family: '='},
template:
'<p>{{ family.name }}</p>'+
'<ul>' +
'<li ng-repeat="child in family.children">' +
'<tree family="child"></tree>' +
'</li>' +
'</ul>',
compile: function(element) {
return RecursionHelper.compile(element);
}
};
});
查看此Plunker以查看演示。我认为这个解决方案最好的原因是:
- 您不需要特殊指令,这使得您的HTML更加简洁。
- 递归逻辑被抽象成RecurisionHelper服务,因此您可以保持指令的干净。