Когда использовать двойные фигурные скобки {{}} в угловом
Взятые из Угловой документации:
Угловые выражения
Угловые выражения являются фрагментами кода, подобными JavaScript, которые в основном помещаются в интерполяционные привязки, такие как
<span title="{{ attrBinding }}">{{ textBinding }}</span>
но также используется непосредственно в атрибутах директивы, таких как ng-click="functionExpression()"
.
Например, это допустимые выражения в Angular:
1 + 2 a + b user.name items [index]
Однако я немного смущен, когда использовать синтаксис двойных фигурных скобок {{}}
а когда нет. Документация, по-видимому, предполагает, что вам не нужны они при использовании выражений в атрибутах директивы (см. Пример ng-click выше).
Хотя следующий код, который работает, предлагает анекдотические доказательства обратного:
<ul id="Menu">
<li ng-repeat="appModule in applicationModules"
id="{{appModule.Name}}"
ng-class="{ 'selected' : selectedAppModule == '{{appModule.Name}}' }"
ng-click="menuClicked(appModule.Name)">
<a href="#Content/{{appModule.Name}}">{{appModule.Display}}</a>
</li>
</ul>
Обратите внимание, что в директиве ng-class используются двойные фигурные скобки, а внутри директивы ng-click они отсутствуют.
Откуда вы знаете, когда их использовать, а когда нет?
Ответы
Ответ 1
Это зависит от соответствующего атрибута директивы и типа привязки, который он использует. Более того, это зависит от того, что вы намерены в данной ситуации.
Из вашего примера:
ng-repeat="appModule in applicationModules"
Нет необходимости в фигурных скобках, так как это выражение оценивается угловым внутри директивы ng-repeat.
id="{{appModule.Name}}"
Здесь нам нужны фигурные скобки, так как мы хотим, чтобы id был равен значению выражения.
ng-class="{ 'selected' : selectedAppModule == '{{appModule.Name}}' }"
Я уверен, что это может быть написано как:
ng-class="{ 'selected' : selectedAppModule == appModule.Name }"
И вы получаете то же поведение.
ng-click="menuClicked(appModule.Name)"
В этом примере нам нужно, чтобы ng-click привязывался к методу с именем menuClicked.
Обычно мы используем {{}}, когда хотим оценить выражение и при работе с атрибутами нам не всегда нужно использовать {{}}, поскольку они во многих случаях оцениваются за кулисами.
Простой совет. Правило большого пальца, когда требуется {{}}, - это думать об этом как обертке для .ToString()
-method. Имеет смысл преобразование выражения в строку, то есть с помощью {{}}. (Любой встречный пример очень приветствуется)
Ответ 2
Проверьте документацию. Избегайте использования интерполяции {{ }}
когда в документации указано, что директива принимает выражение. В случае ng-src
в документе явно говорится о применении {{ }}
. Если атрибут не является директивой AngularJS, используйте интерполяцию.
ошибочный
ng-class="{ 'selected' : selectedAppModule == '{{appModule.Name}}' }"
Вышеприведенный пример является примером смешивания интерполяции и угловых депрессий.
Вместо этого используйте:
ng-class="{ 'selected' : selectedAppModule == appModule.Name }"
Из Документов:
Почему смешивание интерполяции и выражений является плохой практикой:
- Это увеличивает сложность разметки
- Нет никакой гарантии, что он работает для каждой директивы, потому что сама интерполяция является директивой. Если другая директива обращается к данным атрибута перед запуском интерполяции, она получит необработанную разметку интерполяции, а не данные.
- Это влияет на производительность, поскольку интерполяция добавляет еще один наблюдатель в область.
- Поскольку это не рекомендуется использовать, мы не проверяем это, и изменения в ядре AngularJS могут нарушить ваш код.
- Руководство разработчика AngularJS - смешивание интерполяции и выражений
Обновить
Не используйте интерполяцию с помощью: