Я очень новичок в AngularJS. Кто-нибудь может объяснить мне разницу между этими операторами AngularJS: &, @ and =
при выделении области видимости с соответствующим примером.
javascript
angularjs
Нур Рони
источник
источник
Ответы:
@
позволяет передать значение, определенное в атрибуте директивы, в область изоляции директивы. Значением может быть простое строковое значение (myattr="hello"
) или строка с интерполяцией AngularJS со встроенными выражениями (myattr="my_{{helloText}}"
). Думайте об этом как об односторонней связи из родительской области в дочернюю директиву. У Джона Линдквиста есть серия коротких скринкастов, объясняющих каждый из них. Скринкаст на @ здесь: https://egghead.io/lessons/angularjs-isolate-scope-attribute-binding&
позволяет изолированной области действия директивы передавать значения в родительскую область для оценки в выражении, определенном в атрибуте. Обратите внимание, что атрибут directive является неявным выражением и не использует синтаксис выражения с двойными фигурными скобками. Это сложнее объяснить в тексте. Скринкаст на & находится здесь: https://egghead.io/lessons/angularjs-isolate-scope-expression-binding=
устанавливает двустороннее выражение привязки между изолирующей областью директивы и родительской областью. Изменения в дочерней области распространяются на родительский и наоборот. Думайте о = как о комбинации @ и &. Скриншот на = здесь: https://egghead.io/lessons/angularjs-isolate-scope-two-way-bindingИ, наконец, вот скриншот, который показывает все три, использованные вместе в одном представлении: https://egghead.io/lessons/angularjs-isolate-scope-review
источник
Я хотел бы объяснить концепции с точки зрения наследования прототипов JavaScript. Надеюсь, поможет понять.
Существует три варианта определения области действия директивы:
scope: false
: Угловой по умолчанию. Область действия директивы в точности совпадает с областью действия родительской области (parentScope
).scope: true
: Angular создает область действия для этой директивы. Область действия прототипно наследуется отparentScope
.scope: {...}
Изолированная сфера объясняется ниже.Указание
scope: {...}
определяетisolatedScope
. AnisolatedScope
не наследует свойства отparentScope
, хотяisolatedScope.$parent === parentScope
. Это определяется через:isolatedScope
не имеет прямого доступа кparentScope
. Но иногда директиве необходимо общаться сparentScope
. Они общаются через@
,=
и&
. Тема об использовании символов@
,=
и&
речь идет о сценариях использованияisolatedScope
.Обычно он используется для некоторых общих компонентов, используемых разными страницами, таких как модалы. Изолированная область предотвращает загрязнение глобальной области и легко распределяется между страницами.
Вот основная директива: http://jsfiddle.net/7t984sf9/5/ . Изображение для иллюстрации:
@
: односторонняя привязка@
просто передает свойство изparentScope
вisolatedScope
. Это называетсяone-way binding
, что означает, что вы не можете изменить значениеparentScope
свойств. Если вы знакомы с наследованием JavaScript, вы можете легко понять эти два сценария:Если свойство привязки является примитивным типом, как
interpolatedProp
в примере: вы можете изменитьinterpolatedProp
, ноparentProp1
не изменится. Однако, если вы измените значениеparentProp1
,interpolatedProp
будет перезаписано новым значением (когда angular $ digest).Если свойство привязки - это какой-то объект, например
parentObj
: так как переданный объектisolatedScope
является ссылкой, изменение значения вызовет эту ошибку:TypeError: Cannot assign to read only property 'x' of {"x":1,"y":2}
=
: двусторонняя привязка=
называетсяtwo-way binding
, что означает, что любая модификация вchildScope
будет также обновлять значение вparentScope
, и наоборот. Это правило работает как для примитивов, так и для объектов. Если вы измените тип привязкиparentObj
на be=
, вы обнаружите, что можете изменить значениеparentObj.x
. Типичный примерngModel
.&
: привязка функции&
позволяет директиве вызывать некоторуюparentScope
функцию и передавать ей значение из директивы. Например, проверьте JSFiddle: & в области действия директивы .Определите интерактивный шаблон в директиве, например:
И используйте директиву как:
Переменная
valueFromDirective
передается из директивы в родительский контроллер через{valueFromDirective: ...
.Ссылка: Понимание областей
источник
Не моя скрипка, но http://jsfiddle.net/maxisam/QrCXh/ показывает разницу. Ключевая часть:
источник
@ : односторонняя привязка
= : двусторонняя привязка
& : привязка функции
источник
AngularJS - изолированные области видимости - @ vs = vs &
Короткие примеры с пояснениями доступны по ссылке ниже:
http://www.codeforeach.com/angularjs/angularjs-isolated-scopes-vs-vs
@ - односторонняя привязка
В директиве:
Ввиду:
= - двусторонняя привязка
В директиве:
Ввиду:
& - вызов функции
В директиве:
Ввиду:
источник
Мне потребовалось очень много времени, чтобы действительно разобраться с этим. Ключом для меня было понимание того, что «@» относится к вещам, которые вы хотите оценить in situ и передать в директиву как константу, где «=» фактически пропускает сам объект.
Есть хороший пост в блоге, который объясняет это по этому адресу: http://blog.ramses.io/technical/AngularJS-the-difference-between-@-&-and-=-when-declaring-directives-using-isolate-scopes
источник