AngularJS: как установить переменную внутри шаблона?

91

Как я могу избежать того, чтобы {{f = ...}}оператор в третьей строке распечатал содержимое forecast[day.iso]?

Я хочу избегать использования forecast[day.iso].temperatureи так далее на каждой итерации.

<div ng-repeat="day in forecast_days">
  {{$index}} - {{day.iso}} - {{day.name}}
  {{f = forecast[day.iso]}}
  Temperature: {{f.temperature}}<br>
  Humidity: {{f.humidity}}<br>
  ...
</div>
Дэниел Ф
источник
3
Возможно, это не ответ, но полезный совет - использовать {{f = прогноз [day.iso]; ""}}, поскольку он ничего не печатает в представлении.
Мэтт Леонович

Ответы:

190

Используйте ngInit : https://docs.angularjs.org/api/ng/directive/ngInit

<div ng-repeat="day in forecast_days" ng-init="f = forecast[day.iso]">
  {{$index}} - {{day.iso}} - {{day.name}}
  Temperature: {{f.temperature}}<br>
  Humidity: {{f.humidity}}<br>
  ...
</div>

Пример: http://jsfiddle.net/coma/UV4qF/

кома
источник
31
Если вам нужно несколько переменных, просто разделите их точкой с запятой ';'
bentzy
Совет для непосвященных ... в зависимости от структуры вашего шаблона вы можете получить все записи, показывающие только последнее значение вашей переменной (в моем случае Angular обновил замены в последующем цикле дайджеста, поскольку все они привязаны к такое же выражение)! Чтобы справиться с этой ситуацией, вы можете назначить переменную как свойство текущей повторяемой записи (если это возможно для вашего варианта использования). В приведенном выше примере это будетng-init="day.f = forecast[day.iso]"
Джон Рикс
35

Это не лучший ответ , но это также вариант: поскольку вы можете объединить несколько выражений, но отображается только последнее, вы можете завершить свое выражение, ""и ваша переменная будет скрыта.

Итак, вы можете определить переменную с помощью:

{{f = forecast[day.iso]; ""}}
Занон
источник
Это задокументированная функция?
Daniel F
@DanielF, я не нашел. Я только что увидел этот комментарий, протестировал идею, он мне понравился и решил добавить в качестве ответа, так как он более заметен и его труднее потерять.
Zanon
@DanielF, только что нашел этот высоко оцененный ответ, который предлагает такое же решение. Это также без ссылки на документ.
Zanon
@DanielF, я обновил свой ответ. Пришлось задать вопрос, чтобы лучше понять. Это не особенность. Просто поведение конкатенационных выражений.
Zanon
8
Этот прием особенно полезен, когда вы хотите, чтобы выражение было привязано к изменениям области, а не запускалось один раз при инициализации.
Ронни