有一些流行的递归角度指令Q&A,它们都归结为以下解决方案之一:
第一个 问题是,除非您全面地管理手动编译过程,否则无法删除以前编译的代码。 第二种方法
的问题是……不是指令,而是失去了其强大的功能,但是更紧迫的是,不能像指令一样对它进行参数化;它只是绑定到新的控制器实例。
我一直在手动执行an angular.bootstrap
或@compile()
in link函数,但这给我留下了手动跟踪要删除和添加的元素的问题。
有没有一种好的方法来使参数化的递归模式能够管理添加/删除元素以反映运行时状态?也就是说,一棵带有添加/删除节点按钮和一些输入字段的树,其值向下传递到节点的子节点。也许是第二种方法与链接范围的组合(但是我不知道如何做到这一点)?
线程中描述的解决方案的启发,我将递归功能抽象为service。
module.factory('RecursionHelper', ['$compile', function($compile){
return {
/**
* Manually compiles the element, fixing the recursion loop.
* @param element
* @param [link] A post-link function, or an object with function(s) registered via pre and post properties.
* @returns An object containing the linking functions.
*/
compile: function(element, link){
// Normalize the link parameter
if(angular.isFunction(link)){
link = { post: link };
}
// Break the recursion loop by removing the contents
var contents = element.contents().remove();
var compiledContents;
return {
pre: (link && link.pre) ? link.pre : null,
/**
* Compiles and re-adds the contents
*/
post: function(scope, element){
// Compile the contents
if(!compiledContents){
compiledContents = $compile(contents);
}
// Re-add the compiled contents to the element
compiledContents(scope, function(clone){
element.append(clone);
});
// Call the post-linking function, if any
if(link && link.post){
link.post.apply(null, arguments);
}
}
};
}
};
}]);
用法如下:
module.directive("tree", ["RecursionHelper", 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) {
// Use the compile function from the RecursionHelper,
// And return the linking function(s) which it returns
return RecursionHelper.compile(element);
}
};
}]);
观看此Plunker进行演示。我最喜欢此解决方案,因为:
更新:从Angular 1.5.x开始,不再需要其他技巧,但仅适用于 template ,不适用于 templateUrl
问题内容: 我在这里找到了一个很棒的树指令。原文:http://jsfiddle.net/n8dPm/ 我一直在试图通过其他几个做题,要了解它的功能。我不太明白呈现树指令的递归调用是如何工作的。主要是编译功能 什么时候所有的编译函数都调用? $ compile函数何时被缓存在变量中(这是链接函数吗?),何时追加?为什么不总是附加? - 问题答案: Ng网站上有一些很棒的文档(我认为是最好的文档)。
英特尔软件开发人员手册提到“指令获取和页表访问可以通过锁定指令”。这是什么意思,为什么重要? 有一篇文章说,许多Windows函数以指令开始,因为它对于安全的代码挂钩很有用:它可以原子地替换为两字节的相对跳转。但是如果对内存的提取访问可以“传递锁定的指令”,那么下面的情况是否可能发生呢? null 这样的事情也有可能发生吗? CPU0原子地用相对跳转替换指令 因为指令提取可以“传递锁定的指令”,所
问题内容: 我正在尝试构建一个指令,该 指令 负责在其声明的元素上 添加更多指令 。例如,我要建立一个指令,需要增加的照顾,和。 如果我尝试添加这些属性然后使用,则显然会生成一个无限循环,因此我正在检查是否已添加所需的属性: 当然,如果我没有该元素,则将设置属性,但不会引导该指令。 这种方法正确还是我做错了?有没有更好的方法来实现相同的行为? UDPATE :鉴于这是实现此目标的唯一方法,是否有一
问题内容: 我有一个form指令,它使用带有隔离范围的指定属性: 它位于一个内部,因此我传递的表达式包括该对象的作为回调函数的参数: 完成指令后,它会从其控制器函数中调用。在大多数情况下,这很好,这就是我想要做的,但是有时我想从自身内部添加另一个参数。 是否有一个允许这样的角度表达式:,导致用调用? 如果没有,最整洁的方法是什么? 我发现这可行: 用 和指令调用 但是我认为这不是特别整洁,它涉及在
问题内容: 这里有角的新手。我试图找出将对象传递给指令时出了什么问题。 这是我的指令: 这是我调用指令的模板: 是一组对象。 当我运行此,日志,而日志罚款的范围,甚至有一个与所有的数据,我找孩子。 我不确定我在这里做错了什么,因为这种确切的方法以前对我有用。 编辑: 我已经用所有必需的代码创建了一个插件:http ://plnkr.co/edit/uJCxrG 如您所见,该作用域在范围中可用,但我
问题内容: 我想知道是否有一种方法可以将参数传递给指令? 我想做的是从控制器添加一个指令,如下所示: 是否可以同时传递一个参数,以便我的指令模板的内容可以链接到一个作用域或另一个作用域? 这是指令: 如果我想使用相同的指令但使用$ scope.title2怎么办? 问题答案: 这是我解决问题的方法: 指示 控制者 现在,我可以通过同一指令使用不同的作用域,并动态附加它们。