Подтвердить что ты не робот

Директива Angularjs: Изолированная область действия и attrs

См. пример здесь

foodMeApp.directive('fmRating', function() {
  return {
    restrict: 'E',
    scope: {
      symbol: '@',
      max: '@',
      readonly: '@'
    },
    require: 'ngModel',
    link: function(scope, element, attrs, ngModel) {

      attrs.max = scope.max = parseInt(scope.max || 5, 10);
...

Angular требуется symbol, max, readonly для определения в изолированном объекте scope для доступа к нему из родительской области.

используется здесь

<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true"></fm-rating>

Итак, какова цель attrs? Невозможно получить доступ ко всем атрибутам, прошедшим через attrs. Почему невозможно получить значение max как attrs.max вместо scope.max

Зачем назначать назад, например attrs.max = scope.max?

Поскольку это приложение написано авторами Angular, я ожидаю причину.

спасибо.

4b9b3361

Ответ 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. (Я полагаю, что это может быть способ отправить данные/значения инициализации в директиву - то есть, если вам не нужна привязка данных для этих значений, и вам не нужна интерполяция.)

Ответ 2

Используя attrs, вы можете получить доступ к атрибутам, определенным в вашем теге html, например

<fm-rating ng-model="$parent.restaurant.price" symbol="$" readonly="true">

Итак, в этом случае у вас будет доступ к атрибутам и readonly. Каждый атрибут, который вы определяете в своей настраиваемой директиве, будет доступен для переменной attrs.

Блок:

attrs.max = scope.max = parseInt(scope.max || 5, 10);
проанализировать и присвоить текущее значение scope.max или 5, если оно не существует, в scope.max и attrs.max, Таким образом, после задания вы можете прочитать с attrs.max. До этого свойство attrs.max в undefined.

Проверка источника fmRating.js Я не знаю, почему/где/используется этот фрагмент кода.