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?

Vivendi
la source

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 .

Thierry Templier
la source
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

Leo
la source
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>
Wesley Coetzee
la source
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>
monica
la source
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
Alf Moh
la source
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>
Arun s
la source
1

Essaye ça

<div *ngFor="let piece of allPieces; let i=index">
{{i}} // this will give index
</div>
Chirag
la source
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>
vijay kanaujia
la source