AngularJS: Comment définir une variable à l'intérieur d'un modèle?

90

Comment puis-je éviter que la {{f = ...}}déclaration de la troisième ligne imprime le contenu deforecast[day.iso] ?

Je veux éviter d'utiliser forecast[day.iso].temperatureet ainsi de suite à chaque itération.

<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>
Daniel F
la source
3
Ce n'est peut-être pas une réponse, mais une astuce utile est d'utiliser {{f = prévisions [day.iso]; ""}} car cela n'imprimerait rien sur la vue.
Matt Leonowicz

Réponses:

189

Utilisez 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>

Exemple: http://jsfiddle.net/coma/UV4qF/

coma
la source
31
Si vous voulez plus d'une variable, séparez-les simplement par un point-virgule ';'
bentzy
Astuce pour les non-initiés ... en fonction de la structure de votre modèle, vous pouvez vous retrouver avec tous les enregistrements affichant uniquement la dernière valeur de votre variable (dans mon cas, Angular a mis à jour les substitutions lors d'un cycle de résumé ultérieur, car elles sont toutes liées à la même expression)! Pour lutter contre cette situation, vous pouvez affecter la variable en tant que propriété de l'enregistrement actuel en cours d'itération (si cela convient à votre cas d'utilisation). Dans l'exemple ci-dessus, cela deviendraitng-init="day.f = forecast[day.iso]"
John Rix
35

Ce n'est pas la meilleure réponse , mais c'est aussi une option: puisque vous pouvez concaténer plusieurs expressions, mais que seule la dernière est rendue, vous pouvez terminer votre expression avec ""et votre variable sera masquée.

Ainsi, vous pouvez définir la variable avec:

{{f = forecast[day.iso]; ""}}
Zanon
la source
Est-ce une fonctionnalité documentée?
Daniel F
@DanielF, je n'ai pas pu trouver. Je viens de voir ce commentaire, j'ai testé l'idée, je l'ai aimé et j'ai décidé de l'ajouter comme réponse car il a plus de visibilité et est plus difficile à perdre.
Zanon
@DanielF, vient de trouver cette réponse très votée qui propose la même solution. C'est aussi sans lien doc.
Zanon
@DanielF, j'ai mis à jour ma réponse. J'ai dû poser une question pour mieux comprendre. Ce n'est pas une particularité. Juste le comportement d'expressions concaténantes.
Zanon
8
Ce hack est particulièrement utile lorsque vous voulez que l'expression soit liée aux changements de portée, plutôt que de l'exécuter une fois sur init.
Ronny