Spec-Zone.ru › Angular.js 1.4

Улучшить эту документациюИнтерполяция и привязка данных

Разметка интерполяции с встроенными выражениями используется Angular для привязки данных к текстовым узлам и значениям атрибутов.

Ниже приведен пример интерполяции:

<a ng-href="img/{{username}}.jpg">Hello {{username}}!</a>

Как работают привязки текста и атрибутов

Во время процесса компиляции компилятор использует службу $interpolate для проверки, содержат ли текстовые узлы и атрибуты элементов разметку интерполяции со встроенными выражениями.

В случае положительного результата компилятор добавляет директиву interpolate к узлу и регистрирует наблюдения за вычисляемой функцией интерполяции, которая будет обновлять соответствующие текстовые узлы или значения атрибутов в рамках обычного цикла переваривания.

Обратите внимание, что у директивы interpolate есть приоритет 100, и она устанавливает наблюдение в функции preLink.

Привязка к булевым атрибутам

Атрибуты, такие как disabled , называются boolean атрибутами, потому что их наличие означает true , а их отсутствие — false. Мы не можем использовать обычные привязки атрибутов с ними, потому что спецификация HTML не требует от браузеров сохранять значения булевых атрибутов. Это означает, что если мы поместим выражение Angular интерполяции в такой атрибут, то информация о привязке будет утеряна, потому что браузер игнорирует значение атрибута.

В следующем примере информация об интерполяции будет проигнорирована, и браузер просто интерпретирует атрибут как присутствующий, что означает, что кнопка всегда будет отключена.

Disabled: <input type="checkbox" ng-model="isDisabled" />
<button disabled="{{isDisabled}}">Disabled</button>

По этой причине Angular предоставляет специальные директивы с префиксом ng для следующих булевых атрибутов: disabled, required, selected, checked, readOnly и open.

Эти директивы принимают выражение внутри атрибута и устанавливают соответствующий булев атрибут в true, когда выражение вычисляется как истинное.

Disabled: <input type="checkbox" ng-model="isDisabled" />
<button ng-disabled="isDisabled">Disabled</button>

ngAttr для привязки к произвольным атрибутам

Веб-браузеры иногда требовательны к значениям, которые они считают допустимыми для атрибутов.

Например, рассмотрим этот шаблон:

<svg>
  <circle cx="{{cx}}"></circle>
</svg>

Мы ожидали, что Angular сможет привязаться к этому, но при проверке консоли мы видим что-то вроде Error: Invalid value for attribute cx="{{cx}}". Из-за ограничений API DOM SVG вы не можете просто написать cx="{{cx}}".

С ng-attr-cx вы можете обойти эту проблему.

Если атрибут с привязкой имеет префикс ngAttr (денормализован как ng-attr-), то во время привязки он будет применен к соответствующему атрибуту без префикса. Это позволяет привязываться к атрибутам, которые иначе будут обработанны браузерами (например, атрибутам circle[cx] SVG элемента). При использовании ngAttr, используется флаг allOrNothing $interpolate, поэтому, если какое-либо выражение в интерполированной строке приводит к undefined, атрибут удаляется и не добавляется к элементу.

Например, мы могли бы исправить пример выше, написав вместо этого:

<svg>
  <circle ng-attr-cx="{{cx}}"></circle>
</svg>

Если нужно изменить атрибут с верблюжьей нотацией (SVG-элементы имеют допустимые атрибуты с верблюжьей нотацией), например viewBox в элементе svg , можно использовать подчеркивания для обозначения того, что привязываемый атрибут естественно имеет верблюжью нотацию.

Например, чтобы привязаться к viewBox, можно написать:

<svg ng-attr-view_box="{{viewBox}}">
</svg>

Другие атрибуты также могут не работать должным образом, когда они содержат разметку интерполяции, и их можно использовать с ngAttr вместо этого. Ниже приведен список известных проблемных атрибутов:

  • size в элементах <select> (см. вопрос 1619)
  • placeholder в <textarea> в Internet Explorer 10/11 (см. вопрос 5025)
  • type в <button> в Internet Explorer 11 (см. вопрос 14117)

Встраивание разметки интерполяции внутри выражений

Примечание: Атрибуты директивы Angular принимают либо выражения, либо разметку интерполяции со встроенными выражениями. Считается плохой практикой встраивать разметку интерполяции внутри выражения:
<div ng-show="form{{$index}}.$invalid"></div>

Вместо этого следует делегировать вычисление сложных выражений области видимости, как показано ниже:

<div ng-show="getForm($index).$invalid"></div>
function getForm(index) {
  return $scope['form' + index];
}

Вы также можете получить доступ к scope с помощью this в ваших шаблонах:

<div ng-show="this['form' + $index].$invalid"></div>

Почему смешивание интерполяции и выражений — плохая практика:

  • Это увеличивает сложность разметки
  • Нет гарантии, что это работает для каждой директивы, поскольку сама интерполяция является директивой. Если другая директива получает доступ к данным атрибута до выполнения интерполяции, она получит исходную разметку интерполяции, а не данные.
  • Это влияет на производительность, так как интерполяция добавляет ещё одно наблюдение к области видимости.
  • Поскольку это не рекомендуемое использование, мы не тестируем это, и изменения в ядре Angular могут сломать ваш код.

© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.4.14/docs/guide/interpolation

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API