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 descriptionwłaściwość w zakresie podrzędnym będzie bieżącą wartością wyrażenia "The movie title is {{$ctrl.movie.title}}", gdzie moviejest 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 taglinedo zasięgu potomnego bez ustanawiania wiązania jednokierunkowego lub dwukierunkowego. Uwaga : jeśli taglinepoczątkowo znajduje się undefinedw 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.
