ngFor,其中索引作为属性中的值


570

我有一个简单的ngFor循环,它也跟踪当前情况index。我想将该index值存储在属性中,以便可以打印它。但我不知道这是如何工作的。

我基本上有这个:

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

我想#i在属性中存储的值data-index。我尝试了几种方法,但没有一种起作用。

我在这里有一个演示:http : //plnkr.co/edit/EXpOKAEIFlI9QwuRcZqp?p=preview

如何将index值存储在data-index属性中?

Answers:


996

我将使用以下语法将索引值设置为HTML元素的属性:

角度> = 2

您必须使用let声明值,而不是#

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

角度= 1

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

这是更新的plunkr:http ://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview 。


4
实际上,attr.是一种语法,告诉Angular2将表达式的值设置为属性名称。我想这不只是评估JSON ;-)请参阅此链接:angular.io/docs/ts/latest/guide/template-syntax.html
Thierry Templier,

1
谢谢,这就是窍门。另外,我的意思是把ngForli代替ul
维旺迪

1
我回滚了最近的编辑,以同时拥有原始答案和新的更新代码值。我正在寻找一些早期测试版的东西,看到这个答案进行了修改,使其不再应用于β版角2
ps2goat

4
更新:08/2017 <div * ngFor =“让英雄英雄;让i = index; trackBy:trackById”>
Maxi

4
截至2018年10月17日,Angular 6使用* ngFor =“ let item of items; index as i”(请参阅​​下面的Leo答案)。
凝胶

316

在Angular 5/6/7/8中:

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

在旧版本中

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

Angular.io▸API▸NgForOf

单元测试示例

另一个有趣的例子


11
就是这个!截至2018年10月17日工作。谢谢。(为什么他们不断更改语法,所以很烦人?
Gel,

2
这是比第一个更好,更简单的答案。
肯里·桑切斯

2
index as i效果很好,谢谢。但是,难道不是*ngFor要重复要重复的元素<li>吗(例如在这种情况下)?您建议的代码创建多个<ul>而不是多个<li>
Liran H

index as i比更优雅let i = index
Dabbbb。

107

只是对此的更新,Thierry的答案仍然是正确的,但是在以下方面对Angular2进行了更新:

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

现在#i = index应该是let i = index

编辑/更新:

*ngFor应该是你想要的foreach的元素,所以在这个例子中它应该是:

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

编辑/更新

角度5

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

EDIIT /更新

角7/8

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

3
#item应该是let item;-)
君特Zöchbauer

51

我认为它已经被回答过了,但是如果您要填充一个无序列表,这只是一个更正,*ngFor它将出现在您要重复的元素中。所以它应该是明智的<li>。而且,Angular2现在使用let来声明一个变量。

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

我认为,最佳实践是在ul标签中指定* ngFor指令<ul * ngFor =“让项的内容;索引为i” [attr.data-index] =“ i”> <li> {{item} } </ li> </ ul>
bajran

1
如果在ul标记中指定ngFor,那么将要重复的实体将是ul,但是在这里您不想重复ul,您只想迭代列表元素(即li)。
莫妮卡'18

20

其他答案是正确的,但您可以[attr.data-index]完全省略,而只需使用

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

2

您可以直接使用[attr.data-index]将索引保存到Angular 2及更高版本中可用的data-index属性。

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

1

尝试这个

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

0

与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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.