【问题标题】:How to understand the `terminal` of directive?如何理解指令的“终端”?
【发布时间】:2013-02-22 09:28:12
【问题描述】:

在本页:http://docs.angularjs.org/guide/directive

指令定义对象

终端

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

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

  1. directive1 {优先级:1,终端:false}
  2. directive2 {优先级:10,终端:false}
  3. directive3 {优先级:100,终端:false}
  4. directive4 with { priority: 100, terminal: true} // 这是真的
  5. directive5 {优先级:1000,终端:false}

请注意directive4terminal:true,其他有false

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

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

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

【问题讨论】:

    标签: angularjs angularjs-directive


    【解决方案1】:

    优先级

    仅当您在一个元素上有多个指令时,优先级才相关。优先级决定了这些指令的应用/启动顺序。在大多数情况下您不需要优先级,但有时当您使用 compile 函数时,您希望确保您的 compile 函数首先运行。

    终端

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

    终端属性告诉 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 的指令,它们都会被应用,因为具有相同优先级的指令的顺序是不确定的。

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

    【讨论】:

    • 谢谢,但你没有提到terminal(指令4)。如果一个 html 标签包含所有 5 个指令,那么顺序是什么?
    • 我已经用一些示例更新了我的答案,希望可以解决问题。
    • 确切地说,具有相同优先级的指令将始终被调用,即使另一个具有相同优先级的指令的终端设置为 true。那是因为具有相同优先级的指令的顺序是不确定的,所以它们都会被调用。
    • 那为什么ng-init(优先级450)与ng-repeat(优先级1000的终端)在同一个元素上工作?
    • @Adam 它之所以有效,是因为在运行ng-repeat 之后,您会为重复集合中的每个项目留下一个新元素,每个元素都有自己的子范围和属性(可能是指令)。然后这些属性正常运行,就好像您手动编写了每个属性并在每个属性上放置了相同的指令。一个更简单的例子是ng-if。根据条件插入或删除整个 DOM 元素。其他指令每次插入时都需要重新运行,但不应在ng-ifng-repeat 之前运行。除非这是您的目标,否则请使用 priority: 1001
    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多