To pytanie zostało już pobite na śmierć, ale i tak podzielę się nim na wypadek, gdyby ktoś jeszcze zmagał się z okropnym bałaganem, jakim są zakresy AngularJS. Pokrywa ta wola =
, <
, @
, &
i ::
. Pełny opis można znaleźć tutaj .
=
ustanawia wiązanie dwukierunkowe. Zmiana właściwości w obiekcie nadrzędnym spowoduje zmianę w obiekcie podrzędnym i odwrotnie.
<
ustanawia wiązanie w jedną stronę, od rodzica do dziecka. Zmiana właściwości elementu nadrzędnego spowoduje zmianę elementu podrzędnego, ale zmiana właściwości elementu podrzędnego nie wpłynie na właściwość elementu nadrzędnego.
@
przypisze do właściwości potomnej wartość ciągu atrybutu tagu. Jeśli atrybut zawiera wyrażenie , właściwość potomna jest aktualizowana za każdym razem, gdy wyrażenie zmienia się na inny ciąg. Na przykład:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Tutaj description
właściwość w zakresie podrzędnym będzie bieżącą wartością wyrażenia "The movie title is {{$ctrl.movie.title}}"
, gdzie movie
jest obiektem w zakresie nadrzędnym.
&
jest nieco podstępny i wydaje się, że nie ma istotnego powodu, aby kiedykolwiek z niego korzystać. Pozwala ocenić wyrażenie w zakresie nadrzędnym, zastępując parametry zmiennymi z zakresu podrzędnego. Przykład ( 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'
}
});
Biorąc pod uwagę parentVar=10
, wyrażenie parentFoo({myVar:5, myOtherVar:'xyz'})
będzie oceniać, 5 + 10 + 'xyz'
a komponent będzie renderowany jako:
<div>15xyz</div>
Kiedy chciałbyś kiedykolwiek skorzystać z tej zawiłej funkcjonalności? &
jest często używany przez ludzi do przekazania do zakresu potomnego funkcji wywołania zwrotnego w zakresie nadrzędnym. W rzeczywistości jednak ten sam efekt można uzyskać, używając funkcji <, aby przekazać funkcję, co jest prostsze i pozwala uniknąć nieporęcznej składni nawiasów klamrowych w celu przekazania parametrów ( {myVar:5, myOtherVar:'xyz'}
). Rozważać:
Oddzwonienie za pomocą &
:
<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: '&'
}
});
Oddzwonienie za pomocą <
:
<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: '<'
}
});
Zauważ, że obiekty (i tablice) są przekazywane przez odniesienie do zakresu potomnego, a nie kopiowane. Oznacza to, że nawet jeśli jest to wiązanie jednokierunkowe, pracujesz z tym samym obiektem w zakresie nadrzędnym i podrzędnym.
Aby zobaczyć różne prefiksy w akcji, otwórz tę paczkę .
Łączenie jednorazowe (inicjowanie) przy użyciu
::
[Oficjalne dokumenty]
Późniejsze wersje AngularJS wprowadzają opcję posiadania powiązania jednorazowego, w którym właściwość zasięgu potomnego jest aktualizowana tylko raz. Poprawia to wydajność, eliminując potrzebę oglądania właściwości nadrzędnej. Składnia jest inna niż powyżej; aby zadeklarować powiązanie jednorazowe, dodajesz ::
przed wyrażeniem w znaczniku komponentu :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
Spowoduje to propagowanie wartości tagline
do zasięgu potomnego bez ustanawiania wiązania jednokierunkowego lub dwukierunkowego. Uwaga : jeśli tagline
początkowo znajduje się undefined
w zakresie nadrzędnym, kątowy będzie go obserwował, dopóki się nie zmieni, a następnie dokona jednorazowej aktualizacji odpowiedniej właściwości w zakresie podrzędnym.
Podsumowanie
Poniższa tabela pokazuje, jak działają przedrostki w zależności od tego, czy właściwość jest obiektem, tablicą, łańcuchem itp.