AngularJS:如何在模板内部设置变量?


89

如何避免{{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 = Forecast [day.iso];“”}},因为它不会在视图上显示任何内容。
Matt Leonowicz 2015年

Answers:


188

使用ngInithttps : //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 2014年

未启动的提示...根据模板的结构,最终可以得到所有记录,这些记录仅显示变量的最后一个值(在我的情况下,Angular在随后的摘要循环中更新了替换,因为它们都绑定到了相同的表达)!为了应对这种情况,您可以将变量分配为要迭代的当前记录的属性(如果对您的用例可行)。在上面的示例中,该位置将变为ng-init="day.f = forecast[day.iso]"
John Rix

35

不是最佳答案,而是一个选择:由于您可以连接多个表达式,但是只渲染最后一个表达式,因此您可以使用结束表达式,""并且变量将被隐藏。

因此,您可以使用以下命令定义变量:

{{f = forecast[day.iso]; ""}}

这是有文件记录的功能吗?
Daniel F

@DanielF,我找不到。我刚刚看到了评论,对该创意进行了测试,喜欢它,并决定添加为答案,因为它具有更高的知名度并且很难丢失。
Zanon

@DanielF,刚发现这个投票率很高的答案,提出了相同的解决方案。它也没有文档链接。
Zanon

@DanielF,我已经更新了答案。我不得不问一个问题以更好地理解它。这不是一个特殊功能。只是连接表达式的行为。
Zanon

8
当您希望将表达式绑定到范围更改而不是在init上运行一次时,此技巧特别有用。
罗尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.