Ich versuche, ein ausgewertetes Attribut aus meiner benutzerdefinierten Direktive abzurufen, finde jedoch nicht den richtigen Weg.
Ich habe diese jsFiddle erstellt, um sie auszuarbeiten.
<div ng-controller="MyCtrl">
<input my-directive value="123">
<input my-directive value="{{1+1}}">
</div>
myApp.directive('myDirective', function () {
return function (scope, element, attr) {
element.val("value = "+attr.value);
}
});
Was vermisse ich?
javascript
binding
angularjs
directive
Shlomi Schwartz
quelle
quelle
Antworten:
Hinweis: Ich aktualisiere diese Antwort, wenn ich bessere Lösungen finde. Ich behalte die alten Antworten auch zum späteren Nachschlagen, solange sie verwandt bleiben. Die neueste und beste Antwort steht an erster Stelle.
Bessere Antwort:
Direktiven in Angularjs sind sehr mächtig, aber es braucht Zeit, um zu verstehen, welche Prozesse dahinter stehen.
Während Sie Direktiven erstellen, können Sie mit anglejs einen isolierten Bereich mit einigen Bindungen an den übergeordneten Bereich erstellen . Diese Bindungen werden durch das Attribut angegeben, mit dem Sie das Element in DOM anhängen, und wie Sie die Eigenschaft scope im Direktivendefinitionsobjekt definieren .
Es gibt drei Arten von Bindungsoptionen, die Sie im Bereich definieren können und die Sie als Präfix-bezogene Attribute schreiben.
HTML
In diesem Fall können wir im Rahmen der Direktive (unabhängig davon, ob es sich um eine Verknüpfungsfunktion oder eine Steuerung handelt) auf folgende Eigenschaften zugreifen:
"Immer noch OK" Antwort:
Da diese Antwort akzeptiert wurde, aber einige Probleme hat, werde ich sie auf eine bessere aktualisieren. Anscheinend
$parse
handelt es sich um einen Dienst, der nicht in den Eigenschaften des aktuellen Bereichs liegt, was bedeutet, dass er nur Winkelausdrücke akzeptiert und den Bereich nicht erreichen kann.{{
,}}
Ausdrücke werden kompiliert, während anglejs initiiert. Wenn wir also versuchen, in unserer Direktivenmethode auf sie zuzugreifenpostlink
, sind sie bereits kompiliert. ({{1+1}}
ist bereits2
in der Richtlinie).So möchten Sie Folgendes verwenden:
.
Eine Sache, die Sie hier beachten sollten, ist, dass Sie die Wertzeichenfolge in Anführungszeichen setzen sollten, wenn Sie sie festlegen möchten. (Siehe 3. Eingang)
Hier ist die Geige zum Spielen: http://jsfiddle.net/neuTA/6/
Alte Antwort:
Ich entferne dies nicht für Leute, die wie ich irregeführt werden können. Beachten Sie, dass die Verwendung
$eval
vollkommen in Ordnung ist, aber$parse
ein anderes Verhalten aufweist. In den meisten Fällen benötigen Sie dies wahrscheinlich nicht.Der Weg, dies zu tun, ist wieder einmal mit
scope.$eval
. Es kompiliert nicht nur den Winkelausdruck, sondern hat auch Zugriff auf die Eigenschaften des aktuellen Bereichs.Was Sie vermissen war
$eval
.quelle
$scope.text
wird in der Verknüpfungsfunktion undefiniert. Die Art und Weise, wie die Antwort derzeit formuliert ist, klingt so, als wäre sie nicht undefiniert. Sie müssen $ watch () verwenden (oder $ watch () funktioniert auch hier), um den interpolierten Wert asynchron anzuzeigen. Siehe meine Antwort und auch stackoverflow.com/questions/14876112/…$parse
Dienst injiziert und dann nie verwendet zu werden. Vermisse ich etwasFür einen Attributwert, der in einer Direktive interpoliert werden muss, die keinen isolierten Bereich verwendet, z.
Verwenden Sie die Methode von Attributes
$observe
:Von der Direktivenseite ,
Wenn der Attributwert nur eine Konstante ist, z.
Sie können verwenden $ eval verwenden, wenn der Wert eine Zahl oder ein Boolescher Wert ist und Sie den richtigen Typ möchten:
Wenn der Attributwert eine Zeichenfolgenkonstante ist oder Sie möchten, dass der Wert in Ihrer Direktive vom Typ Zeichenfolge ist, können Sie direkt darauf zugreifen:
In Ihrem Fall verwenden Sie jedoch, da Sie interpolierte Werte und Konstanten unterstützen möchten
$observe
.quelle
Die anderen Antworten hier sind sehr richtig und wertvoll. Aber manchmal möchten Sie einfach nur: einen einfachen alten analysierten Wert bei der Instanziierung der Direktive erhalten, ohne Aktualisierungen zu benötigen und ohne den isolierten Bereich zu beeinträchtigen. Zum Beispiel kann es nützlich sein, eine deklarative Nutzlast in Ihre Direktive als Array oder Hash-Objekt in der folgenden Form bereitzustellen:
In diesem Fall können Sie auf den Punkt kommen und einfach ein schönes Basic verwenden
angular.$eval(attr.attrName)
.Arbeits Fiddle .
quelle
Für die gleiche Lösung, die ich gesucht habe
Angularjs directive with ng-Model
.Hier ist der Code, der das Problem löst.
HTML DOM
Mein Ergebnis ist:
quelle
Verwenden Sie $ timeout, da die Direktive nach dem Laden von dom aufgerufen wird, sodass Ihre Änderungen nicht übernommen werden
quelle