ngFor avec index comme valeur dans l'attribut


571

J'ai une ngForboucle simple qui garde également la trace du courant index. Je souhaite stocker cette indexvaleur dans un attribut afin de pouvoir l'imprimer. Mais je ne peux pas comprendre comment cela fonctionne.

J'ai essentiellement ceci:

<ul *ngFor="#item of items; #i = index" data-index="#i">
    <li>{{item}}</li>
</ul>

Je veux stocker la valeur de #idans l'attribut data-index. J'ai essayé plusieurs méthodes mais aucune n'a fonctionné.

J'ai une démo ici: http://plnkr.co/edit/EXpOKAEIFlI9QwuRcZqp?p=preview

Comment puis-je stocker la indexvaleur dans l' data-indexattribut?

Réponses:


1003

J'utiliserais cette syntaxe pour définir la valeur d'index dans un attribut de l'élément HTML:

Angulaire> = 2

Vous devez utiliser letpour déclarer la valeur plutôt que #.

<ul>
    <li *ngFor="let item of items; let i = index" [attr.data-index]="i">
        {{item}}
    </li>
</ul>

Angulaire = 1

<ul>
    <li *ngFor="#item of items; #i = index" [attr.data-index]="i">
        {{item}}
    </li>
</ul>

Voici le plunkr mis à jour: http://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview .


4
En fait, attr.est une syntaxe pour indiquer à Angular2 de définir la valeur de l'expression sur le nom de l'attribut. Ce n'est pas juste comme évaluer JSON, je suppose ;-) Voir ce lien: angular.io/docs/ts/latest/guide/template-syntax.html
Thierry Templier

1
Merci, ça fait l'affaire. Aussi, je voulais mettre le ngForsur le liau lieu du ul.
Vivendi

1
J'ai annulé la modification récente afin d'avoir à la fois la réponse d'origine et la nouvelle valeur de code mise à jour. Je cherchais des éléments bêta précoces et j'ai vu que cette réponse avait été modifiée, donc elle ne s'appliquait plus à la version bêta d'angular 2.
ps2goat

4
MISE À JOUR: 08/2017 <div * ngFor = "let hero of heroes; let i = index; trackBy: trackById">
Maxi

4
au 17 octobre 2018, Angular 6 utilise * ngFor = "let item of items; index as i" Voir la réponse de Leo ci-dessous.
Gel

318

Dans Angular 5/6/7/8:

<ul>
  <li *ngFor="let item of items; index as i">
    {{i+1}} {{item}}
  </li>
</ul>

Dans les anciennes versions

<ul *ngFor="let item of items; index as i">
  <li>{{i+1}} {{item}}</li>
</ul>

Angular.io ▸ API ▸ NgForOf

Exemples de tests unitaires

Un autre exemple intéressant


11
Ça y est! Fonctionne depuis le 17 octobre 2018. Je vous remercie. (pourquoi ils continuent de changer de syntaxe, si ennuyeux?
Gel

2
c'est une réponse meilleure et simple que la première.
Kenry Sanchez

2
index as ifonctionne très bien, merci. Mais le *ngForbut n'est-il pas d'aller sur l'élément à répéter (par exemple le <li>dans ce cas)? Le code que vous avez suggéré crée plusieurs <ul>rameurs s que plusieurs <li>s.
Liran H

index as iest plus élégant quelet i = index
Dabbbb.

108

Juste une mise à jour, la réponse de Thierry est toujours correcte, mais il y a eu une mise à jour d'Angular2 en ce qui concerne:

<ul *ngFor="let item of items; let i = index" [attr.data-index]="i">
  <li>{{item}}</li>
</ul>

Le #i = indexdevrait maintenant êtrelet i = index

MODIFIER / METTRE À JOUR:

Le *ngFordevrait être sur l'élément que vous souhaitez foreach, donc pour cet exemple, il devrait être:

<ul>
  <li *ngFor="let item of items; let i = index" [attr.data-index]="i">{{item}}</li>
</ul>

MODIFIER / METTRE À JOUR

Angulaire 5

<ul>
  <li *ngFor="let item of items; index as i" [attr.data-index]="i">{{item}}</li>
</ul>

EDIIT / UPDATE

Angulaire 7/8

<ul *ngFor="let item of items; index as i">
  <li [attr.data-index]="i">{{item}}</li>
</ul>

3
Et #itemdevrait être let item;-)
Günter Zöchbauer

52

Je pense qu'il a déjà été répondu auparavant, mais juste une correction si vous remplissez une liste non ordonnée, le *ngForviendra dans l'élément que vous souhaitez répéter. Il devrait donc être insidieux <li>. De plus, Angular2 utilise désormais let pour déclarer une variable.

<ul>
    <li *ngFor="let item of items; let i = index" [attr.data-index]="i">     
               {{item}}
    </li>
</ul>

Je pense qu'il est préférable de spécifier la directive * ngFor dans la balise ul <ul * ngFor = "let item of items; index as i" [attr.data-index] = "i"> <li> {{item} } </li> </ul>
bajran

1
Si vous spécifiez ngFor dans la balise ul, alors l'entité qui sera répétée sera ul, mais ici vous ne voulez pas répéter ul, vous voulez juste itérer sur les éléments de la liste ie li.
monica

21

Les autres réponses sont correctes mais vous pouvez [attr.data-index]tout à fait omettre et simplement utiliser

<ul>
    <li *ngFor="let item of items; let i = index">{{i + 1}}</li>
</ul

2

Vous pouvez utiliser [attr.data-index] directement pour enregistrer l'index dans l'attribut data-index qui est disponible dans les versions Angular 2 et supérieures.

    <ul*ngFor="let item of items; let i = index" [attr.data-index]="i">
         <li>{{item}}</li>
    </ul>

1

Essaye ça

<div *ngFor="let piece of allPieces; let i=index">
{{i}} // this will give index
</div>

0

avec pagination laravel

file.component.ts file

    datasource: any = {
        data: []
    }

    loadData() {
        this.service.find(this.params).subscribe((res: any) => {
            this.datasource = res;
        });
    }

html file

   <tr *ngFor="let item of datasource.data; let i = index">
       <th>{{ datasource.from + i }}</th>
   </tr>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.