web-dev-qa-db-de.com

Wie ist das "Terminal" der Richtlinie zu verstehen?

Auf dieser Seite: http://docs.angularjs.org/guide/directive

Direktive Definition Objekt

terminal

Wenn true festgelegt ist, ist die aktuelle Priorität die letzte auszuführende Anweisungsgruppe (alle Anweisungen mit der aktuellen Priorität werden weiterhin ausgeführt, da die Ausführungsreihenfolge für dieselbe Priorität nicht definiert ist).

Ich verstehe es nicht gut. Was macht current priority bedeuten? Wenn es solche Richtlinien gibt:

  1. direktive1 mit {Priorität: 1, Terminal: false}
  2. direktive2 mit {Priorität: 10, Terminal: false}
  3. direktive3 mit {Priorität: 100, Terminal: false}
  4. richtlinie4 mit {priorität: 100, terminal: true} // das ist true
  5. direktive5 mit {Priorität: 1000, Terminal: false}

Bitte beachten Sie die directive4 hat terminal:true und andere haben false.

Wenn es ein HTML-Tag gibt, enthält es alle 5 Anweisungen:

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

Wie ist die Ausführungsreihenfolge der 5 Anweisungen?

64
Freewind

Priorität

Die Priorität ist nur relevant, wenn Sie mehrere Anweisungen für ein Element haben. Die Priorität bestimmt, in welcher Reihenfolge diese Richtlinien angewendet/gestartet werden. In den meisten Fällen benötigen Sie keine Priorität. Wenn Sie jedoch die Kompilierungsfunktion verwenden, möchten Sie manchmal sicherstellen, dass Ihre Kompilierungsfunktion zuerst ausgeführt wird.

Terminal

Die Eigenschaft terminal ist auch nur für Direktiven relevant, die sich auf demselben HTML-Element befinden. Das heißt, wenn Sie <div my-directive1></div> <div my-directive2></div> Haben, beeinflussen sich priority und terminal in Ihren Anweisungen my-directive1 Und my-directive2 Nicht gegenseitig. Sie beeinflussen sich nur, wenn Sie <div my-directive1 my-directive2></div> Haben.

Die terminal -Eigenschaft weist Angular an, alle Direktiven für das nachfolgende Element zu überspringen (niedrigere Priorität). Dieser Code kann es also aufklären:

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");
        }
    }
});

In der Konsole wird nur "I'm myDirective2" und "I'm myDirective3" angezeigt.

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

Aber dafür würde man auch "I'm myDirective1" sehen, da sie sich auf verschiedene Elemente beziehen.

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

Originalbeitrag

In Ihrem Beispiel werden nur die Anweisungen mit den Prioritäten 100 und 1000 angewendet, da eine Anweisung mit höherer Priorität zuerst angewendet wird. Die Anweisung mit der Priorität 1000 wird also zuerst angewendet.

Wenn Sie in diesem Fall zwei Direktiven mit der Priorität 100 haben, werden beide angewendet, da die Reihenfolge der Direktiven mit der gleichen Priorität undefiniert ist.

Beachten Sie, dass dies nur für Direktiven gilt, die sich auf demselben Element befinden.

146
Anders Ekdahl