如何理解指令的`terminal`?

时间:2013-03-07 08:58:56

标签: angularjs angularjs-directive

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

  

指令定义对象

     

终端

     

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

我不太了解。 current priority是什么意思?如果有这样的指令:

  1. directive1 with {priority:1,terminal:false}
  2. 指令2,{priority:10,terminal:false}
  3. 指令3,{priority:100,terminal:false}
  4. directive4,{priority:100,terminal:true} //这是真的
  5. 指令5,{priority:1000,terminal:false}
  6. 请注意directive4terminal:true而其他人有false

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

    <div directive1 directive2 directive3 directive4 directive5></div>
    

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

1 个答案:

答案 0 :(得分:146)

<强>优先级

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

<强>终端

终端属性也仅与同一HTML元素上的指令相关。也就是说,如果您的指令中<div my-directive1></div> <div my-directive2></div>priorityterminal my-directive1my-directive2不会相互影响。如果您有<div my-directive1 my-directive2></div>,它们只会相互影响。

终端属性告诉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");
        }
    }
});

为此,你只能在控制台中看到“我是myDirective2”和“我是myDirective3”。

<div my-directive1 my-directive2 my-directive3></div>

但是为此,你会看到“我是myDirective1”,因为它们在不同的元素上。

<div my-directive1></div>
<div my-directive2></div>
<div my-directive3></div>

原帖

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

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

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