如何理解指令的`terminal`?

Fre*_*ind 64 angularjs angularjs-directive

在此页面中:http://docs.angularjs.org/guide/directive

指令定义对象

终奌站

如果设置为true,则当前优先级将是将执行的最后一组指令(当前优先级的任何指令仍将执行,因为未定义相同优先级的执行顺序).

我不太懂.什么current priority意思?如果有这样的指令:

  1. 带有{priority:1,terminal:false}的directive1
  2. 带有{priority:10,terminal:false}的directive2
  3. 带有{priority:100,terminal:false}的directive3
  4. 带有{priority:100,terminal:true}的directive4 //这是真的
  5. 带有{priority:1000,terminal:false}的directive5

请注意directive4terminal:true和其他人有false.

如果有一个html标签包含所有5个指令:

<div directive1 directive2 directive3 directive4 directive5></div>
Run Code Online (Sandbox Code Playgroud)

5指令的执行顺序是什么?

And*_*ahl 147

优先

只有在一个元素上有多个指令时,优先级才有意义.优先级确定将应用/启动这些指令的顺序.在大多数情况下,您不需要优先级,但有时当您使用编译功能时,您需要确保首先运行编译功能.

终奌站

terminal属性也仅与同一HTML元素上的指令相关.也就是说,如果你有<div my-directive1></div> <div my-directive2></div>,priority并且terminal在你的指令中my-directive1并且my-directive2不会相互影响.如果你有,他们只会互相影响<div my-directive1 my-directive2></div>.

terminal属性告诉Angular跳过该元素后面的所有指令(优先级较低).所以这段代码可能会清除它:

myModule.directive('myDirective1', function() {
    return {
        priority: 1,
        terminal: false,
        link: function() {
            console.log("I'm myDirective1");
        }
    }
});

myModule.directive('myDirective2', function() {
    return {
        priority: 10,
        terminal: true,
        link: function() {
            console.log("I'm myDirective2");
        }
    }
});

myModule.directive('myDirective3', function() {
    return {
        priority: 100,
        terminal: false,
        link: function() {
            console.log("I'm myDirective3");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

为此,你只能在控制台中看到"我是myDirective2"和"我是myDirective3".

<div my-directive1 my-directive2 my-directive3></div>
Run Code Online (Sandbox Code Playgroud)

但是对于这一点,你也会看到"我是myDirective1",因为它们处于不同的元素上.

<div my-directive1></div>
<div my-directive2></div>
<div my-directive3></div>
Run Code Online (Sandbox Code Playgroud)

原帖

在您的示例中,优先级为100和1000的指令是唯一将应用的指令,因为首先应用具有较高优先级的指令,因此将首先应用优先级为1000的指令.

如果在这种情况下有两个优先级为100的指令,则将应用这两个指令,因为具有相同优先级的指令的顺序是未定义的.

请注意,这仅适用于同一元素上的指令.

  • @Adam它的工作原理是因为在`ng-repeat`运行之后,你会为repeat集合中的每个项目留下一个新元素,每个元素都有自己的子范围和属性(可能是指令).然后这些属性正常运行,就像您手动编写每个属性并在每个属性上放置相同的指令一样.一个更简单的例子就是`ng-if`.根据条件插入或删除整个DOM元素.其他指令需要在每次插入时重新运行,但它们不应在`ng-if`或`ng-repeat`之前运行.除非那是你的目标,否则请使用`priority:1001`等 (4认同)
  • 我已经用一些例子更新了我的答案,希望能够解决问题. (3认同)
  • 确切地说,即使具有相同优先级的另一个指令将terminal设置为true,也将始终调用具有相同优先级的指令.那是因为具有相同优先级的指令的顺序是未定义的,因此它们都将被调用. (2认同)
  • 那么为什么[`ng-init`](https://github.com/angular/angular.js/blob/0e50810c53428f4c1f5bfdba9599df54cb7a6c6e/src/ng/directive/ngInit.js)(优先级450)与[`ng-repeat`一起使用](https://github.com/angular/angular.js/blob/b0972a2e75909e41dbac6e4413ada7df2d51df3a/src/ng/directive/ngRepeat.js)(优先级为1000的终端)在同一个元素上? (2认同)