Diese Frage wurde bereits zu Tode geprügelt, aber ich werde sie trotzdem teilen, falls jemand anderes da draußen mit dem schrecklichen Durcheinander von AngularJS zu kämpfen hat. Dies wird Abdeckung =
, <
, @
, &
und ::
. Die vollständige Beschreibung finden Sie hier .
=
stellt eine wechselseitige Bindung her. Das Ändern der Eigenschaft im übergeordneten Element führt zu einer Änderung des untergeordneten Elements und umgekehrt.
<
stellt eine Einwegbindung zwischen Eltern und Kind her. Das Ändern der Eigenschaft im übergeordneten Element führt zu einer Änderung des untergeordneten Elements, das Ändern der untergeordneten Eigenschaft wirkt sich jedoch nicht auf die übergeordnete Eigenschaft aus.
@
weist der untergeordneten Eigenschaft den Zeichenfolgenwert des Tag-Attributs zu. Wenn das Attribut einen Ausdruck enthält , wird die untergeordnete Eigenschaft immer dann aktualisiert, wenn der Ausdruck eine andere Zeichenfolge ergibt. Zum Beispiel:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Hier ist die description
Eigenschaft im untergeordneten Bereich der aktuelle Wert des Ausdrucks "The movie title is {{$ctrl.movie.title}}"
, wobei movie
es sich um ein Objekt im übergeordneten Bereich handelt.
&
ist ein bisschen knifflig, und tatsächlich scheint es keinen zwingenden Grund zu geben, es jemals zu benutzen. Sie können einen Ausdruck im übergeordneten Bereich auswerten und Parameter durch Variablen aus dem untergeordneten Bereich ersetzen. Ein Beispiel ( plunk ):
<child-component
foo = "myVar + $ctrl.parentVar + myOtherVar"
</child-component>
angular.module('heroApp').component('childComponent', {
template: "<div>{{ $ctrl.parentFoo({myVar:5, myOtherVar:'xyz'}) }}</div>",
bindings: {
parentFoo: '&foo'
}
});
Gegeben parentVar=10
, der Ausdruck parentFoo({myVar:5, myOtherVar:'xyz'})
wird ausgewertet 5 + 10 + 'xyz'
und die Komponente wird wie folgt gerendert:
<div>15xyz</div>
Wann würden Sie jemals diese verschlungene Funktionalität nutzen wollen? &
wird häufig von Personen verwendet, um eine Rückruffunktion im übergeordneten Bereich an den untergeordneten Bereich zu übergeben. In der Realität kann der gleiche Effekt jedoch erzielt werden, indem '<' zum Übergeben der Funktion verwendet wird. Dies ist einfacher und vermeidet die umständliche Syntax geschweifter Klammern zum Übergeben von Parametern ( {myVar:5, myOtherVar:'xyz'}
). Erwägen:
Rückruf mit &
:
<child-component parent-foo="$ctrl.foo(bar)"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo({bar:'xyz'})">Call foo in parent</button>',
bindings: {
parentFoo: '&'
}
});
Rückruf mit <
:
<child-component parent-foo="$ctrl.foo"/>
angular.module('heroApp').component('childComponent', {
template: '<button ng-click="$ctrl.parentFoo('xyz')">Call foo in parent</button>',
bindings: {
parentFoo: '<'
}
});
Beachten Sie, dass Objekte (und Arrays) unter Bezugnahme auf den untergeordneten Bereich übergeben und nicht kopiert werden. Dies bedeutet, dass Sie, selbst wenn es sich um eine Einwegbindung handelt, sowohl im übergeordneten als auch im untergeordneten Bereich mit demselben Objekt arbeiten.
Öffnen Sie diesen Plunk , um die verschiedenen Präfixe in Aktion zu sehen .
Einmalige Bindung (Initialisierung) mit
::
[Offizielle Dokumente] In
späteren Versionen von AngularJS wird die Option einer einmaligen Bindung eingeführt, bei der die Eigenschaft des untergeordneten Bereichs nur einmal aktualisiert wird. Dies verbessert die Leistung, da die übergeordnete Eigenschaft nicht mehr überwacht werden muss. Die Syntax unterscheidet sich von oben; Um eine einmalige Bindung zu deklarieren, fügen Sie ::
vor dem Ausdruck im Komponenten-Tag Folgendes hinzu :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
Dadurch wird der Wert von tagline
an den untergeordneten Bereich weitergegeben, ohne dass eine Einweg- oder Zweiwegbindung hergestellt wird. Hinweis : Wenn sich tagline
Angular ursprünglich undefined
im übergeordneten Bereich befindet, wird es von Angular überwacht, bis es sich ändert, und anschließend wird die entsprechende Eigenschaft im untergeordneten Bereich einmalig aktualisiert.
Zusammenfassung
Die folgende Tabelle zeigt, wie die Präfixe funktionieren, je nachdem, ob es sich bei der Eigenschaft um ein Objekt, ein Array, eine Zeichenfolge usw. handelt.