Ich habe eine Direktive mit einem isolierten Gültigkeitsbereich (damit ich die Direktive an anderen Stellen wiederverwenden kann), und wenn ich diese Direktive mit einem verwende ng-repeat
, funktioniert sie nicht.
Ich habe die gesamte Dokumentation und die Antworten zum Stapelüberlauf zu diesem Thema gelesen und verstehe die Probleme. Ich glaube, ich habe alle üblichen Fallstricke vermieden.
Ich verstehe also, dass mein Code aufgrund des durch die ng-repeat
Direktive erstellten Bereichs fehlschlägt . Meine eigene Direktive erstellt einen Isolate-Scope und führt eine bidirektionale Datenbindung an ein Objekt im übergeordneten Scope durch. Meine Direktive weist dieser gebundenen Variablen einen neuen Objektwert zu. Dies funktioniert einwandfrei, wenn meine Direktive ohne verwendet wird ng-repeat
(die übergeordnete Variable wird korrekt aktualisiert). Mit ng-repeat
erstellt die Zuweisung jedoch eine neue Variable im ng-repeat
Bereich und die übergeordnete Variable sieht die Änderung nicht. All dies basiert wie erwartet auf dem, was ich gelesen habe.
Ich habe auch gelesen, dass bei mehreren Anweisungen für ein bestimmtes Element nur ein Bereich erstellt wird. Und dass priority
in jeder Direktive ein a gesetzt werden kann, um die Reihenfolge zu definieren, in der die Direktiven angewendet werden; Die Anweisungen werden nach Priorität sortiert und anschließend ihre Kompilierungsfunktionen aufgerufen (Suche nach dem Wort Priorität unter http://docs.angularjs.org/guide/directive ).
Ich hatte gehofft, dass ich die Priorität verwenden kann, um sicherzustellen, dass meine Direktive zuerst ausgeführt wird und am Ende einen isolierten Bereich erstellt. Wenn ng-repeat
sie ausgeführt wird, wird der isolierte Bereich wiederverwendet, anstatt einen Bereich zu erstellen, der prototypisch vom übergeordneten Bereich erbt. In der ng-repeat
Dokumentation heißt es, dass diese Richtlinie auf Prioritätsebene ausgeführt wird 1000
. Es ist nicht klar, ob 1
es sich um eine höhere oder eine niedrigere Prioritätsstufe handelt. Als ich 1
in meiner Direktive die Prioritätsstufe verwendet habe, hat dies keinen Unterschied gemacht, also habe ich es versucht 2000
. Aber das macht die Sache noch schlimmer: Meine wechselseitigen Bindungen werden undefined
und meine Direktive zeigt nichts an.
Ich habe eine Geige erstellt, um mein Problem zu zeigen . Ich habe die priority
Einstellung in meiner Richtlinie auskommentiert. Ich habe eine Liste von Namensobjekten und eine Direktive namens name-row
, die die Vor- und Nachnamenfelder im Namensobjekt anzeigt. Wenn auf einen angezeigten Namen geklickt wird, soll eine selected
Variable im Hauptbereich festgelegt werden. Das Array von Namen und die selected
Variable werden name-row
mithilfe der bidirektionalen Datenbindung an die Direktive übergeben.
Ich weiß, wie dies funktioniert, indem Funktionen im Hauptbereich aufgerufen werden. Ich weiß auch, dass selected
Dinge funktionieren würden , wenn sie sich in einem anderen Objekt befinden und ich mich an das äußere Objekt binde. Aber ich bin im Moment nicht an diesen Lösungen interessiert.
Stattdessen habe ich folgende Fragen:
- Wie kann ich verhindern,
ng-repeat
dass ein Bereich erstellt wird, der prototypisch vom übergeordneten Bereich erbt, und stattdessen den Isolate-Bereich meiner Direktive verwenden? - Warum
2000
funktioniert die Prioritätsstufe in meiner Richtlinie nicht? - Ist es mit Batarang möglich zu wissen, welche Art von Oszilloskop verwendet wird?
ng-repeat
. Ich denke, es ist wertvoll, eigenständige Direktiven mit mischen zu können ng-repeat
. Fortsetzung
ng-repeat
sollte dies keinen Gültigkeitsbereich haben. ng-repeat
Ein Geltungsbereich ist für den typischen Anwendungsfall sinnvoll, daher schlage ich nicht vor, ihn zu ändern. Stattdessen denke ich, wie ich in Alex Osborns Antwort kommentiert habe, dass ich eine Wiederholungsanweisung erstellen werde, die darauf basiert und ng-repeat
keinen eigenen Geltungsbereich schafft. Dies kann dann zum Wiederholen von Anweisungen verwendet werden, die ihre eigenen Isolatbereiche haben. Fortsetzung
ng-repeat
oder die benutzerdefinierte Wiederholungsanweisung ohne Gültigkeitsbereich. Ich denke, es ist in Ordnung, wenn der "Anrufer" dies weiß, aber es ist nicht in Ordnung, wenn ein "Angerufener" (die Anweisung wird wiederholt) weiß, ob er wiederholt wird oder nicht. Fortsetzung
scope: true
für Ihre Direktive. Siehe auch (falls Sie dies noch nicht getan haben) stackoverflow.com/questions/14914213/… Nur weil eine Direktive an mehreren Stellen verwendet wird, bedeutet dies nicht, dass wir automatisch einen isolierten Bereich verwenden sollten.