Це питання вже побито на смерть, але я все одно поділюсь цим у випадку, якщо хтось там бореться із жахливим безладом, яке є областями 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 буде спостерігати за ним, поки вона не зміниться, а потім зробить одноразове оновлення відповідного властивості у дочірній області.
Підсумок
У таблиці нижче показано, як працюють префікси залежно від того, властивість є об'єктом, масивом, рядком тощо.
