Dou*_*ell 6 angularjs angularjs-directive
为什么有人会设置terminal:true和指令的优先级而不是简单地删除优先级较低的指令?例如,他们可以写:
<tag directive-1 directive-2 directive-3></tag>
Run Code Online (Sandbox Code Playgroud)
...并且它们可以添加优先级:100和终端:true到指令-3,因此只有指令-3才会应用于该元素.
为什么不会有人改为将模板更改为:
<tag directive-3></tag>
Run Code Online (Sandbox Code Playgroud)
也许它在某些情况下通过允许将多个指令添加到元素并卸载决定哪些实际应用于Angular的工作来简化代码?
谢谢.
设置优先级和终端选项不是关于擦除指令,而是声明编译和链接的顺序.每个人都指出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);
})
})
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
伪重复指令可以这样使用:
<ul>
<li fake-repeat="things" binding="t" add-letter>{{ t }}</li>
<ul>
Run Code Online (Sandbox Code Playgroud)
现在可以将附加指令附加到包含伪重复的相同li,但是它们的优先级+终端选项将决定谁首先编译,以及何时发生链接.通常我们希望li克隆元素,并为add-letter每个绑定复制指令t,但只有add-letter
优先级低于fake-repeat 才会发生.
为每个li生成的链接执行链接.
链接在伪重复之前执行,因此在转发发生之前执行.
编译在伪重复之前停止,因此永远不会执行该指令.
这是一个带有控制台记录的plunker,可供进一步探索.
| 归档时间: |
|
| 查看次数: |
4984 次 |
| 最近记录: |