设置优先级和终端选项不是关于擦除指令,而是声明编译和链接的顺序。每个人都指出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);
})
})
}
}
}
});
伪重复指令可以这样使用:
<ul>
<li fake-repeat="things" binding="t" add-letter>{{ t }}</li>
<ul>
现在可以将额外的指令附加到包含假重复的同一个 li 上,但它们的优先级 + 终端选项将决定谁首先编译,以及何时发生链接。通常我们希望元素被克隆,并且为每个绑定复制 forli
和 for指令,但这只有
在优先级低于 fake-repeat时才会发生。add-letter
t
add-letter
案例 1:添加字母优先级为 0
为每个li
生成的执行链接。
案例 2:添加字母优先级为 1001
链接在假重复之前执行,因此在嵌入发生之前执行。
案例 3:add-letter 优先级为 1001 且终端为真
编译在 fake-repeat 之前停止,因此该指令永远不会执行。
这是一个带有控制台日志记录的插件,用于进一步探索。