ngFor com índice como valor no atributo

571

Eu tenho um ngForloop simples que também mantém o controle da corrente index. Quero armazenar esse indexvalor em um atributo para que eu possa imprimi-lo. Mas não consigo descobrir como isso funciona.

Eu basicamente tenho isso:

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

Eu quero armazenar o valor #ino atributo data-index. Eu tentei vários métodos, mas nenhum deles funcionou.

Eu tenho uma demonstração aqui: http://plnkr.co/edit/EXpOKAEIFlI9QwuRcZqp?p=preview

Como posso armazenar o indexvalor no data-indexatributo?

Vivendi
fonte

Respostas:

1001

Eu usaria essa sintaxe para definir o valor do índice em um atributo do elemento HTML:

Angular> = 2

Você precisa usar letpara declarar o valor e não #.

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

Angular = 1

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

Aqui está o plunkr atualizado: http://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview .

Thierry Templier
fonte
4
De fato, attr.é uma sintaxe para dizer ao Angular2 para definir o valor da expressão como o nome do atributo. Não é apenas como avaliar o JSON, eu acho ;-) Veja este link: angular.io/docs/ts/latest/guide/template-syntax.html
Thierry Templier
1
Obrigado, isso faz o truque. Além disso, eu pretendia colocar o ngForem livez do ul.
Vivendi
1
Revirei a edição recente para ter a resposta original e o novo valor de código atualizado. Eu estava procurando algumas coisas beta inicial e viu que esta resposta foi modificada, por isso deixou de ser aplicado para a versão beta do angular 2.
ps2goat
4
UPDATE: 08/2017 <div * ngFor = "vamos herói dos heróis, deixe i = índice; trackBy: trackById">
Maxi
4
a partir de 17 de outubro de 2018, o Angular 6 está usando * ngFor = "let item of items; index as i" Veja a resposta de Leo abaixo.
Gel
318

No Angular 5/6/7/8:

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

Nas versões mais antigas

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

Angular.io, API e NgForOf

Exemplos de teste de unidade

Outro exemplo interessante

Leo
fonte
11
é isso! A partir de 17 de outubro de 2018. Obrigado. (por que eles continuam mudando sintaxe, tão irritante?
Gel
2
esta é uma resposta melhor e simples que a primeira.
Kenry Sanchez
2
index as ifunciona muito bem, obrigado. Mas o *ngForobjetivo não é repetir o elemento a ser repetido (por exemplo <li>, neste caso)? O código que você sugeriu cria vários <ul>pais do que vários <li>s.
Liran H
index as ié mais elegante quelet i = index
Dabbbb.
108

Apenas uma atualização para isso, a resposta de Thierry ainda está correta, mas houve uma atualização para o Angular2 com relação a:

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

O #i = indexagora deve serlet i = index

EDIT / UPDATE:

Ele *ngFordeve estar no elemento que você deseja transmitir, portanto, neste exemplo, deve ser:

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

EDITAR / ATUALIZAR

Angular 5

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

EDIIT / UPDATE

Angular 7/8

<ul *ngFor="let item of items; index as i">
  <li [attr.data-index]="i">{{item}}</li>
</ul>
Wesley Coetzee
fonte
3
E #itemdeve ser let item;-)
Günter Zöchbauer
52

Acho que já foi respondido antes, mas apenas uma correção, se você estiver preenchendo uma lista não ordenada, *ngForaparecerá no elemento que você deseja repetir. Portanto, deve ser insidioso <li>. Além disso, o Angular2 agora usa let para declarar uma variável.

<ul>
    <li *ngFor="let item of items; let i = index" [attr.data-index]="i">     
               {{item}}
    </li>
</ul>
Monica
fonte
Eu acho que é uma prática recomendada especificar a diretiva * ngFor na tag ul <ul * ngFor = "deixar item de itens; indexar como i" [attr.data-index] = "i"> <li> {{item} } </li> </ul>
bajran 7/07/2018
1
Se você especificar ngFor na tag ul, a entidade que será repetida será ul, mas aqui você não deseja repetir a ul, basta iterar nos elementos da lista, ou seja, li.
monica
21

As outras respostas estão corretas, mas você pode omitir [attr.data-index]completamente e usar

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

Você pode usar [attr.data-index] diretamente para salvar o índice no atributo data-index, disponível nas versões 2 e acima do Angular.

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

Tente isto

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

com paginação 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
fonte