为什么使用terminal:true而不是删除低优先级指令?

Dou*_*ell 6 angularjs angularjs-directive

相关:如何理解指令的`terminal`?

为什么有人会设置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的工作来简化代码?

谢谢.

mor*_*man 5

设置优先级和终端选项不是关于擦除指令,而是声明编译和链接的顺序.每个人都指出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 才会发生.

案例1:添加字母优先级为0

为每个li生成的链接执行链接.

案例2:添加字母优先级为1001

链接在伪重复之前执行,因此在转发发生之前执行.

情况3:添加字母优先级为1001,终端为真

编译在伪重复之前停止,因此永远不会执行该指令.

这是一个带有控制台记录的plunker,可供进一步探索.