Ответ 1
Какова цель attrs?
Атрибуты, определенные в том же элементе, что и ваша директива, имеют несколько целей:
- Это единственный способ передать информацию в директиву, использующую область изоляции. Поскольку область выделения директивы не прототипически наследуется от родительской области, нам нужен способ указать, что мы хотим передать в область изоляции. '@', '=' и '&' в "хеш-объекте", поэтому каждый из них требует атрибута для указания того, какие данные/информация передаются.
- Они служат механизмом межстраничной коммуникации. (Например, Управление связью между независимыми директивами AngularJS независимо)
- Они нормализуют имена атрибутов.
Нельзя ли получить доступ ко всем атрибутам, переданным через attrs?
Да, вы можете, но
- у вас не будет привязки данных.
'@' устанавливает одностороннюю "строковую" привязку данных (родительская область → область выделения переменных). При @значение, которое вы видите/получаете в директиве, всегда является строкой, поэтому не используйте это, если вы пытаетесь передать объект вашей директиве.
'=' устанавливает двустороннюю привязку данных (область полномочий родительского поля ↔).
Без привязки данных ваша директива не может $watch или $наблюдать за изменениями модели/данных автоматически. - значения атрибутов с
{{}}
вызовут проблемы, поскольку они не будут интерполированы. Предположим, что мы имеем<my-directive name="My name is {{name}}">
, а родительская область имеет$scope.name='Mark'
. Затем, внутри функции связывания,console.log(attrs.name)
приводит кundefined
.
Если имя - это свойство области изоляции, определенное с помощью "@", тоattrs.$observe('name', function(val) { console.log(val) })
приводит кMy name is Mark
. (Обратите внимание, что внутри функции связывания функция $observ() должна использоваться для получения интерполированного значения.)
Почему невозможно получить значение max как attrs.max вместо scope.max
ответил выше
Зачем назначать обратно, например attrs.max = scope.max?
Единственная причина, по которой я могу придумать это, - это в случае, если какая-либо другая директива должна увидеть этот атрибут/значение (т.е. межстраничную связь). Тем не менее, другая директива должна запускаться после этой директивы для этого, чтобы она работала (которую можно несколько контролировать с помощью директивы priority
).
Сводка: в директиве с областью выделения, обычно вы не хотите использовать attrs
. (Я полагаю, что это может быть способ отправить данные/значения инициализации в директиву - то есть, если вам не нужна привязка данных для этих значений, и вам не нужна интерполяция.)