ng2: comment créer une variable dans la boucle ngFor

J'essaie de savoir comment créer une variable dans une boucle ngFor.

J'ai une boucle comme ceci:

<td *ngFor="#prod of products">
  <a href="{{getBuild(branch,prod)?.url}}">
    {{getBuild(branch,prod)?.status}}
   </a>
</td>

Vous pouvez voir que l'appel "getBuild" doit être répété plusieurs fois. (beaucoup plus de fois dans mon exemple). Je voudrais un moyen de créer cette variable dans le modèle une fois dans la boucle et de la réutiliser simplement. Est-il un moyen de faire cela?

22
demandé sur anusreemn 2016-02-07 21:38:06

3 réponses

Je pense que les variables locales (définies avec le caractère #) ne s'appliquent pas à votre cas d'utilisation.

En fait, lorsque vous définissez une variable locale sur un élément HTML, elle correspond au composant le cas échéant. Lorsqu'il n'y a pas de Composant sur l'élément, la variable fait référence à l'élément lui-même.

Spécification d'une valeur pour une variable locale vous permet de sélectionner une directive spécifique associé à l'élément courant. Par exemple:

<input #name="ngForm" ngControl="name" [(ngModel)]="company.name"/>

Définira l'instance du ngForm directive associée au courant dans la variable name.

Les variables locales ne ciblent donc pas ce que vous voulez, c'est-à-dire définir une valeur créée pour l'élément courant d'une boucle.

Si vous essayez de faire quelque chose comme ça:

<div *ngFor="#elt of eltList" >
  <span #localVariable="elt.title"></span>
  {{localVariable}}
</div>

, Vous aurez cette erreur suivante:

Error: Template parse errors:
There is no directive with "exportAs" set to "elt.title" ("
  <div *ngFor="#elt of eltList" >
    <span [ERROR ->]#localVariable="elt.title"></span>
    {{localVariable}}
  </div>
"): AppComponent@2:10

Angular2 recherche en fait une directive correspondant au nom fourni elt.title ici)... Voir ce plunkr pour reproduire l'erreur: https://plnkr.co/edit/qcMGr9FS7yQD8LbX18uY?p=preview

, Voir ce lien: http://victorsavkin.com/post/119943127151/angular-2-template-syntax, section "variables Locales" pour plus de détails.

En plus de l'élément courant de l'itération, ngFor fournit uniquement un ensemble de valeurs exportées qui peuvent être aliasées en variables locales: index, last, even et odd.

Voir ce lien: https://angular.io/docs/ts/latest/api/common/NgFor-directive.html

Ce que vous pouvez faire est de créer un sous-composant pour afficher les éléments dans la boucle. Il acceptera l'élément courant comme paramètre et créera votre "variable locale" comme attribut du composant. Vous pourrez alors utiliser cet attribut dans le modèle du composant afin qu'il soit créé une fois par élément dans la boucle. Voici un exemple:

@Component({
  selector: 'elt',
  template: `
    <div>{{attr}}</div>
  `
})
export class ElementComponent {
  @Input() element;

  constructor() {
    // Your old "localVariable"
    this.attr = createAttribute(element.title);
  }

  createAttribute(_title:string) {
    // Do some processing
    return somethingFromTitle;
  }
}

Et la façon de l'utiliser:

<div *ngFor="#elt of eltList" >
  <elt [element]="elt></elt>
</div>
10
répondu Thierry Templier 2016-02-08 09:53:33

Je pense que c'est un cas classique pour faire un sous-composant.

<td *ngFor="#prod of products">
    <subComp [prod]=prod></subComp>
</td>

Votre composant aurait alors une entrée prod et exécuterait la fonction requise Une fois dans OnInit.

Exemple Simple plunk ici

10
répondu Mark Meyer 2016-02-07 20:04:41

Non, il suffit de mettre en cache le résultat dans getBuild pour chaque branch/prod combinaison ou tant qu'il est appelé avec les mêmes valeurs qu'avant.

1
répondu Günter Zöchbauer 2016-02-07 19:55:39