相关:How to understand the terminal of directive?
为什么有人会在指令上设置terminal: true和优先级,而不是简单地删除优先级较低的指令?例如,他们可以这样写:
<tag directive-1 directive-2 directive-3></tag>..。并且它们可以将优先级: 100和终端: true添加到指令-3,以便只将指令-3应用于元素。
为什么不把他们的模板改成:
<tag directive-3></tag>也许在某些情况下,它允许将多个指令添加到一个元素中,并卸载决定哪些指令实际应用于Angular的工作,从而简化了代码?
谢谢。
发布于 2013-09-25 13:03:49
设置优先级和终端选项并不是要删除指令,而是要声明编译和链接的顺序。每个人都指出ng-repeat是优先级+终端+转接的主要例子,所以我将给出一个非常简化的ng-repeat版本:
app.directive('fakeRepeat', function($log) {
return {
priority: 1000,
terminal: true,
transclude: 'element',
compile: function(el, attr, linker) {
return function(scope, $element, $attr) {
angular.forEach(scope.$eval($attr.fakeRepeat).reverse(), function(x) {
var child = scope.$new();
child[attr.binding] = x;
linker(child, function(clone) {
$element.after(clone);
})
})
}
}
}
});伪的repeat指令可以这样使用:
<ul>
<li fake-repeat="things" binding="t" add-letter>{{ t }}</li>
<ul>现在可以将额外的指令附加到包含伪repeat的同一个li上,但是它们的优先级+终止选项将决定谁首先被编译,以及何时发生链接。通常,我们希望克隆li元素,并为每个绑定重复复制add-letter指令,但只有当add-letter的优先级低于t -repeat时,才会发生这种情况。
情况1:添加字母优先级为0
对生成的每个li执行链接。
案例2:添加字母优先级为1001
链接在伪重复之前执行,因此在transclude发生之前执行。
情况3:添加字母优先级为1001,终端为true
编译在fake-repeat之前停止,因此指令永远不会执行。
下面是一个带有控制台日志的plunker,可供进一步探索。
发布于 2014-02-12 14:27:37
我相信terminal是用来处理使用转译的指令,或者是替换所有元素内容的指令。
如果一个元素使用terminal,那么它不希望在初始指令集合期间编译适用的指令。初始收集由Angular的引导过程或手动$compile触发。因为终端指令不想编译优先级较低的指令,并不意味着它不想让指令在以后运行,这就是为什么transclude是一个完美的用例。
内容被编译并存储为链接函数,可以在任何时间针对任何范围进行计算。这就是ngRepeat和ngIf的表现。
当编写一个使用transclusion的指令时,可以考虑是否也应该使用terminal。
我不认为它在与不使用transclude的指令一起使用时是非常有用的。
https://stackoverflow.com/questions/18969610
复制相似问题