Этот вопрос уже забит до смерти, но я все равно поделюсь этим на случай, если кто-то еще будет бороться с ужасным беспорядком, который охватывает AngularJS. Это будет охватывать =, <, @, &и ::. Полное описание можно найти здесь .
=устанавливает двухстороннее связывание. Изменение свойства в родительском элементе приведет к изменению дочернего элемента, и наоборот.
<устанавливает одностороннюю привязку, родитель к ребенку. Изменение свойства в родительском элементе приведет к изменению дочернего, но изменение дочернего свойства не повлияет на родительское свойство.
@присваивает дочернему свойству строковое значение атрибута тега. Если атрибут содержит выражение , дочернее свойство обновляется всякий раз, когда выражение оценивается в другую строку. Например:
<child-component description="The movie title is {{$ctrl.movie.title}}" />
bindings: {
description: '@',
}
Здесь descriptionсвойство в дочерней области будет текущим значением выражения "The movie title is {{$ctrl.movie.title}}", где movieнаходится объект в родительской области.
&это немного сложно, и на самом деле, кажется, нет веской причины когда-либо использовать его. Это позволяет оценивать выражение в родительской области, заменяя параметры переменными из дочерней области. Пример ( 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'
}
});
Учитывая 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 будет наблюдать за ней до тех пор, пока она не изменится, а затем выполнить одноразовое обновление соответствующего свойства в дочерней области.
Резюме
В таблице ниже показано, как работают префиксы в зависимости от того, является ли свойство объектом, массивом, строкой и т. Д.
