Was für eine tolle Frage! Ich würde gerne hören, was andere zu sagen haben, aber hier sind die Richtlinien, die ich verwende.
Die Prämisse für große Höhen: Der Bereich wird als "Klebstoff" verwendet, mit dem wir zwischen dem übergeordneten Controller, der Direktive und der Direktivenvorlage kommunizieren.
Übergeordneter Bereich : scope: false
, also überhaupt kein neuer Bereich
Ich benutze dies nicht sehr oft, aber wie @MarkRajcok sagte, wenn die Direktive nicht auf Bereichsvariablen zugreift (und offensichtlich keine setzt!), Ist dies für mich in Ordnung. Dies ist auch hilfreich für untergeordnete Anweisungen, die nur im Kontext der übergeordneten Anweisung verwendet werden (obwohl es immer Ausnahmen gibt) und die keine Vorlage haben. Grundsätzlich gehört alles mit einer Vorlage nicht zur gemeinsamen Nutzung eines Bereichs, da Sie diesen Bereich von Natur aus für Zugriff und Manipulation verfügbar machen (aber ich bin sicher, dass es Ausnahmen von dieser Regel gibt).
Als Beispiel habe ich kürzlich eine Direktive erstellt, die eine (statische) Vektorgrafik mit einer SVG-Bibliothek zeichnet, die ich gerade schreibe. Es besteht aus $observe
zwei Attributen ( width
und height
) und verwendet diese in seinen Berechnungen, setzt jedoch keine Bereichsvariablen und liest sie auch nicht und verfügt über keine Vorlage. Dies ist ein guter Anwendungsfall, um keinen weiteren Bereich zu erstellen. Wir brauchen keine, warum also die Mühe machen?
In einer anderen SVG-Direktive benötigte ich jedoch einen Datensatz, um ihn zu verwenden, und musste zusätzlich ein kleines Stück Status speichern. In diesem Fall wäre die Verwendung des übergeordneten Bereichs unverantwortlich (wiederum im Allgemeinen). Also stattdessen...
Kinderbereich: scope: true
Anweisungen mit einem untergeordneten Bereich sind kontextsensitiv und sollen mit dem aktuellen Bereich interagieren.
Offensichtlich besteht ein wesentlicher Vorteil gegenüber einem isolierten Bereich darin, dass der Benutzer die Interpolation für alle gewünschten Attribute verwenden kann. Die Verwendung class="item-type-{{item.type}}"
einer Direktive mit einem isolierten Bereich funktioniert beispielsweise nicht standardmäßig, funktioniert jedoch bei einer Direktive mit einem untergeordneten Bereich einwandfrei, da alles, was interpoliert wird, standardmäßig immer noch im übergeordneten Bereich gefunden wird. Außerdem kann die Richtlinie selbst Attribute und Ausdrücke im Rahmen ihres eigenen Geltungsbereichs sicher bewerten, ohne sich um Verschmutzung oder Beschädigung des Elternteils sorgen zu müssen.
Ein Tooltip wird beispielsweise gerade hinzugefügt. Ein isolierter Bereich würde nicht funktionieren (standardmäßig siehe unten), da erwartet wird, dass wir hier andere Direktiven oder interpolierte Attribute verwenden. Der Tooltip ist nur eine Erweiterung. Der Tooltip muss jedoch auch einige Dinge für den Bereich festlegen, die mit einer Unteranweisung und / oder Vorlage verwendet werden sollen, und natürlich den eigenen Status verwalten. Daher wäre es in der Tat ziemlich schlecht, den übergeordneten Bereich zu verwenden. Wir verschmutzen es entweder oder beschädigen es, und Bueno ist es auch nicht.
Ich verwende häufig untergeordnete Bereiche als isolierte oder übergeordnete Bereiche.
Bereich isolieren: scope: {}
Dies gilt für wiederverwendbare Komponenten. :-)
Aber im Ernst, ich stelle mir "wiederverwendbare Komponenten" als "in sich geschlossene Komponenten" vor. Die Absicht ist, dass sie für einen bestimmten Zweck verwendet werden sollen. Daher ist es nicht sinnvoll, sie mit anderen Anweisungen zu kombinieren oder dem DOM-Knoten von Natur aus andere interpolierte Attribute hinzuzufügen.
Genauer gesagt wird alles, was für diese eigenständige Funktionalität benötigt wird, durch angegebene Attribute bereitgestellt, die im Kontext des übergeordneten Bereichs ausgewertet werden. Es handelt sich entweder um Einwegzeichenfolgen ('@'), Einwegausdrücke ('&') oder Zweiwegvariablenbindungen ('=').
Bei in sich geschlossenen Komponenten ist es nicht sinnvoll, andere Anweisungen oder Attribute darauf anzuwenden, da diese für sich allein existieren. Sein Stil wird von einer eigenen Vorlage bestimmt (falls erforderlich) und kann den entsprechenden Inhalt (falls erforderlich) übertragen. Es ist eigenständig, daher stellen wir es in einen isolierten Bereich, um auch zu sagen: "Leg dich nicht damit an. Ich gebe dir eine definierte API durch diese wenigen Attribute."
Eine bewährte Methode besteht darin, so viele vorlagenbasierte Inhalte wie möglich von den Funktionen für Direktivenverknüpfungen und Controller auszuschließen. Dies bietet einen weiteren "API-ähnlichen" Konfigurationspunkt: Der Benutzer der Direktive kann die Vorlage einfach ersetzen! Die Funktionalität blieb alle gleich, und die interne API wurde nie berührt, aber wir können so viel wie nötig mit dem Styling und der DOM-Implementierung herumspielen. ui / bootstrap ist ein großartiges Beispiel dafür, wie man das gut macht, weil Peter & Pawel großartig sind.
Isolierte Zielfernrohre eignen sich auch hervorragend für die Transklusion. Nehmen Sie Tabs; sie sind nicht nur die ganze Funktionalität, aber was auch immer ist im Innern davon können frei aus dem übergeordneten Bereich ausgewertet werden , während die Reiter verlassen (und Scheiben) zu tun , was sie wollen. Die Registerkarten haben eindeutig ihren eigenen Status , der zum Gültigkeitsbereich gehört (um mit der Vorlage zu interagieren), aber dieser Status hat nichts mit dem Kontext zu tun, in dem er verwendet wurde - er ist völlig intern für das, was eine Tabulatoranweisung zu einer Tabulatoranweisung macht. Außerdem ist es wenig sinnvoll, andere Anweisungen mit den Registerkarten zu verwenden. Das sind Tabs - und diese Funktionalität haben wir bereits!
Umgib es mit mehr Funktionalität oder schließe mehr Funktionalität aus, aber die Direktive ist das, was sie bereits ist.
Trotzdem sollte ich beachten, dass es einige Möglichkeiten gibt, einige der Einschränkungen (dh Funktionen) eines isolierten Bereichs zu umgehen, wie @ProLoser in seiner Antwort angedeutet hat. Im Abschnitt "Untergeordneter Bereich" habe ich beispielsweise die Interpolation von Attributen erwähnt, die bei Verwendung eines isolierten Bereichs (standardmäßig) fehlerhaft sind. Aber der Benutzer könnte zum Beispiel einfach verwenden class="item-type-{{$parent.item.type}}"
und es würde wieder funktionieren. Wenn es also einen zwingenden Grund gibt, einen isolierten Bereich anstelle eines untergeordneten Bereichs zu verwenden, Sie sich jedoch über einige dieser Einschränkungen Sorgen machen, sollten Sie wissen, dass Sie bei Bedarf praktisch alle umgehen können.
Zusammenfassung
Anweisungen ohne neuen Geltungsbereich sind schreibgeschützt. Sie sind absolut vertrauenswürdig (dh intern in der App) und berühren die Buchse nicht. Direktiven mit einem untergeordneten Bereich fügen Funktionen hinzu, sind jedoch nicht die einzigen Funktionen. Schließlich beziehen sich isolierte Bereiche auf Richtlinien, die das gesamte Ziel darstellen. Sie sind eigenständig, daher ist es in Ordnung (und am "richtigsten"), sie als Schurken zu betrachten.
Ich wollte meine ersten Gedanken herausbringen, aber wenn ich an mehr Dinge denke, werde ich dies aktualisieren. Aber heiliger Mist - das ist lang für eine SO-Antwort ...
PS: Völlig tangential, aber da es sich um Bereiche handelt, sage ich lieber "prototypisch", während andere "prototypisch" bevorzugen, was genauer zu sein scheint, aber überhaupt nicht gut von der Zunge rollt. :-)