Ich suche nach einer Möglichkeit, innerhalb einer Direktive auf den "übergeordneten" Bereich zuzugreifen. Jede Kombination von Gültigkeitsbereich, Transklusion, Anforderung, Übergabe von Variablen (oder des Gültigkeitsbereichs selbst) von oben usw. Ich bin absolut bereit, mich nach hinten zu beugen, aber ich möchte etwas vermeiden, das völlig hackig oder nicht wartbar ist. Ich weiß zum Beispiel, dass ich es jetzt tun kann, indem ich die $scope
preLink-Parameter nehme und über die $sibling
Bereiche iteriere , um das konzeptionelle "übergeordnete Element " zu finden.
Was ich wirklich möchte, ist, $watch
einen Ausdruck im übergeordneten Bereich zu können. Wenn ich das kann, kann ich das erreichen, was ich hier versuche: AngularJS - Wie rendere ich
einen Teil mit Variablen?
Ein wichtiger Hinweis ist, dass die Richtlinie im selben übergeordneten Bereich wiederverwendbar sein muss. Daher funktioniert das Standardverhalten (Gültigkeitsbereich: false) bei mir nicht. Ich benötige einen individuellen Bereich pro Instanz der Direktive und dann $watch
eine Variable, die im übergeordneten Bereich lebt.
Ein Codebeispiel sagt mehr als 1000 Wörter.
app.directive('watchingMyParentScope', function() {
return {
require: /* ? */,
scope: /* ? */,
transclude: /* ? */,
controller: /* ? */,
compile: function(el,attr,trans) {
// Can I get the $parent from the transclusion function somehow?
return {
pre: function($s, $e, $a, parentControl) {
// Can I get the $parent from the parent controller?
// By setting this.$scope = $scope from within that controller?
// Can I get the $parent from the current $scope?
// Can I pass the $parent scope in as an attribute and define
// it as part of this directive's scope definition?
// What don't I understand about how directives work and
// how their scope is related to their parent?
},
post: function($s, $e, $a, parentControl) {
// Has my situation improved by the time the postLink is called?
}
}
}
};
});
quelle
scope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
$parse
mit=
: Geige .$parse
wird nur bei nicht isolierten Bereichen benötigt.Der Zugriff auf die Controller-Methode bedeutet den Zugriff auf eine Methode im übergeordneten Bereich über die Direktive controller / link / scope.
Wenn die Direktive den übergeordneten Bereich gemeinsam nutzt / erbt, ist es ganz einfach, nur eine übergeordnete Bereichsmethode aufzurufen.
Es ist wenig mehr Arbeit erforderlich, wenn Sie über den Bereich der isolierten Direktive auf die übergeordnete Bereichsmethode zugreifen möchten.
Es gibt nur wenige Optionen (möglicherweise mehr als unten aufgeführt), um eine übergeordnete Bereichsmethode aus dem Bereich isolierter Direktiven aufzurufen oder übergeordnete Bereichsvariablen zu überwachen ( Option 6 speziell).
Beachten Sie, dass ich
link function
in diesen Beispielen verwendet habe, aber Sie können jedirective controller
nach Anforderung auch ein verwenden.Option 1. Durch Objektliteral und aus Direktive HTML-Vorlage
index.html
itemfilterTemplate.html
app.js
Arbeitsplnkr: http://plnkr.co/edit/rgKUsYGDo9O3tewL6xgr?p=preview
Option 2. Durch Object Literal und von Direktive Link / Scope
index.html
itemfilterTemplate.html
app.js
Arbeitsplnkr: http://plnkr.co/edit/BRvYm2SpSpBK9uxNIcTa?p=preview
Option 3. Durch Funktionsreferenz und aus Direktive HTML-Vorlage
index.html
itemfilterTemplate.html
app.js
Arbeitsplnkr: http://plnkr.co/edit/Jo6FcYfVXCCg3vH42BIz?p=preview
Option 4. Durch Funktionsreferenz und aus Direktivenlink / Geltungsbereich
index.html
itemfilterTemplate.html
app.js
Arbeitsplnkr: http://plnkr.co/edit/BSqx2J1yCY86IJwAnQF1?p=preview
Option 5: Durch ng-Modell und bidirektionale Bindung können Sie übergeordnete Bereichsvariablen aktualisieren. . In einigen Fällen müssen Sie möglicherweise keine übergeordneten Bereichsfunktionen aufrufen.
index.html
itemfilterTemplate.html
app.js
Arbeitsplnkr: http://plnkr.co/edit/hNui3xgzdTnfcdzljihY?p=preview
Option 6: Durch
$watch
und$watchCollection
Es ist eine bidirektionale Bindung füritems
in allen obigen Beispielen würden Elemente in der Direktive auch die Änderungen widerspiegeln, wenn Elemente im übergeordneten Bereich geändert werden.Wenn Sie andere Attribute oder Objekte aus dem übergeordneten Bereich überwachen möchten, können Sie dies mit
$watch
und tun$watchCollection
wie unten angegebenhtml
Skript app.js
var app = angle.module ('plunker', []);
Ausführliche Erläuterungen zu Anweisungen finden Sie jederzeit in der AngularJ-Dokumentation.
quelle
und Sie haben den gleichen Bereich (mit übergeordnetem Element)
Abhängig von diesen beiden Optionen scope & transclude gibt es viele Möglichkeiten, auf den übergeordneten Bereich zuzugreifen.
quelle
Hier ist ein Trick, den ich einmal verwendet habe: Erstellen Sie eine "Dummy" -Anweisung, um den übergeordneten Bereich zu speichern, und platzieren Sie ihn irgendwo außerhalb der gewünschten Anweisung. Etwas wie:
und dann
Vielleicht nicht die anmutigste Lösung, aber sie hat den Job erledigt.
quelle
Wenn Sie ES6-Klassen und
ControllerAs
-Syntax verwenden , müssen Sie etwas anderes tun.Sehen Sie sich das folgende Snippet an und beachten Sie, dass dies
vm
derControllerAs
Wert des übergeordneten Controllers ist, der im übergeordneten HTML-Code verwendet wirdquelle
Nachdem ich alles versucht hatte, fand ich endlich eine Lösung.
Fügen Sie einfach Folgendes in Ihre Vorlage ein:
{{currentDirective.attr = parentDirective.attr; ''}}
Es schreibt nur das übergeordnete Bereichsattribut / die übergeordnete Variable, auf die Sie zugreifen möchten, in den aktuellen Bereich.
Beachten Sie auch die
; ''
am Ende der Anweisung, um sicherzustellen, dass Ihre Vorlage keine Ausgabe enthält. (Angular wertet jede Anweisung aus, gibt jedoch nur die letzte aus.)Es ist ein bisschen hackig, aber nach ein paar Stunden Versuch und Irrtum macht es den Job.
quelle