Це питання вже побито на смерть, але я все одно поділюсь цим у випадку, якщо хтось там бореться із жахливим безладом, яке є областями AngularJS. Це буде охоплювати =
, <
, @
, &
і ::
. Повний запис можна знайти тут .
=
встановлює двосторонній зв'язок. Зміна властивості у батька призведе до зміни дитини, і навпаки.
<
встановлює односторонній зв'язок, батько до дитини. Зміна власності у батька призведе до зміни дитини, але зміна властивості дитини не вплине на батьківську властивість.
@
присвоїть дочірній властивості рядкове значення атрибута тегу. Якщо атрибут містить вираз , дочірнє властивість оновлюється кожного разу, коли вираз оцінюється на інший рядок. Наприклад:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Тут description
властивість у дочірній області буде поточним значенням виразу "The movie title is {{$ctrl.movie.title}}"
, де movie
є об'єктом у батьківській області.
&
це трохи хитро, і насправді, здається, немає жодної вагомої причини коли-небудь використовувати його. Це дозволяє оцінити вираз у батьківській області, замінюючи параметри змінними з дочірньої області. Приклад ( планк ):
<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'
}
});
Враховуючи parentVar=10
, вираз parentFoo({myVar:5, myOtherVar:'xyz'})
буде оцінено до, 5 + 10 + 'xyz'
і компонент буде відображатися як:
<div>15xyz</div>
Коли ви коли-небудь хотіли б використовувати цей складний функціонал? &
часто використовується людьми для передачі дочірньої області функції зворотного дзвінка в батьківській області. У дійсності, однак, такого ж ефекту можна досягти, використовуючи '<' для передачі функції, яка є більш простою і уникає незграбного синтаксису фігурних дужок для передачі параметрів ( {myVar:5, myOtherVar:'xyz'}
). Поміркуйте:
Зворотний виклик за допомогою &
:
<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: '&'
}
});
Зворотний виклик за допомогою <
:
<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: '<'
}
});
Зауважте, що об'єкти (та масиви) передаються посиланням на дочірню область, а не копіюються. Це означає, що навіть якщо це одностороння прив'язка, ви працюєте з одним і тим же об'єктом і в батьківській, і в дочірній області.
Щоб побачити різні префікси в дії, відкрийте цей планк .
Одноразова прив'язка (ініціалізація) за допомогою
::
[Офіційні документи] Більш
пізні версії AngularJS вводять можливість мати одноразову прив'язку, де властивість дочірньої області оновлюється лише один раз. Це покращує продуктивність, усуваючи необхідність перегляду батьківського властивості. Синтаксис відрізняється зверху; щоб оголосити разову прив'язку, ви додаєте ::
перед виразом у компоненті тег :
<child-component
tagline = "::$ctrl.tagline">
</child-component>
Це поширюватиме значення tagline
на область дитини, не встановлюючи одностороннього або двостороннього зв’язку. Примітка : якщо tagline
спочатку undefined
знаходиться в батьківській області, angular буде спостерігати за ним, поки вона не зміниться, а потім зробить одноразове оновлення відповідного властивості у дочірній області.
Підсумок
У таблиці нижче показано, як працюють префікси залежно від того, властивість є об'єктом, масивом, рядком тощо.