如何理解指令的“终端”?

66
在此页面中:http://docs.angularjs.org/guide/directive 指令定义对象
终止符
如果设置为 true,则当前优先级将是最后执行的指令集(任何具有相同优先级的指令集的执行顺序仍未定义)。
我不太理解。什么是“当前优先级”? 如果有这些指令:
1. 具有 {priority: 1,terminal: false} 的 directive1 2. 具有 {priority: 10,terminal: false} 的 directive2 3. 具有 {priority: 100,terminal: false} 的 directive3 4. 具有 {priority: 100,terminal: true} 的 directive4 //这个是true 5. 具有 {priority: 1000,terminal: false} 的 directive5
请注意,directive4 具有 terminal:true,其他指令均为 false。
如果一个 HTML 标记具有这 5 个指令:
<div directive1 directive2 directive3 directive4 directive5></div>

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

1个回答

150

优先级

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

终端

终端属性也只与同一个HTML元素上的指令相关。也就是说,如果您有<div my-directive1></div> <div my-directive2></div>,则指令my-directive1my-directive2中的priorityterminal不会相互影响。只有当您有<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");
        }
    }
});

因此,您只会在控制台中看到“I'm myDirective2”和“I'm myDirective3”。

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

但如果没有这个,你也会看到"I'm myDirective1",因为它们在不同的元素上。

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

原始帖子

在你的例子中,具有100和1000优先级的指令是唯一会被应用的,因为具有更高优先级的指令首先被应用,所以具有1000优先级的指令将首先被应用。

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

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


1
谢谢您,但是您没有提到terminal(指令4)。如果一个HTML标签拥有所有5个指令,它们的顺序是什么? - Freewind
3
我已更新我的回答,并添加了一些例子,希望这能让事情更清楚。 - Anders Ekdahl
非常清晰,谢谢。还有一个小问题:如果在标签<div my-directive1 my-directive2 my-directive3 my-directive4></div>中有一个具有{priority: 10, terminal: false}my-directive4指令,那么会怎样呢?它应该始终运行,但它可能在my-directive2之前或之后运行,对吗? - Freewind
2
准确地说,具有相同优先级的指令将始终被调用,即使另一个具有相同优先级且终端设置为true的指令也是如此。这是因为具有相同优先级的指令的顺序未定义,因此它们都将被调用。 - Anders Ekdahl
2
那么为什么ng-init(优先级450)与在同一元素上的ng-repeat(终端优先级1000)一起工作? - Adam
4
它能运行是因为ng-repeat运行后,您将得到与重复集合中每个项目对应的新元素,每个元素都有自己的子作用域和属性(可能是指令)。然后这些属性会正常运行,就像您手动编写并在每个上放置相同指令一样。一个更简单的示例是ng-if。基于其条件插入或删除整个DOM元素。其他指令需要在每次插入时重新运行,但它们不应在ng-ifng-repeat之前运行。除非那是您的目标,然后使用priority: 1001等。 - Madeline Trotter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接