ngFor ที่มีดัชนีเป็นค่าในแอตทริบิวต์


571

ฉันมี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แอตทริบิวต์ได้อย่างไร

คำตอบ:


1000

ฉันจะใช้ไวยากรณ์นี้เพื่อตั้งค่าดัชนีเป็นคุณลักษณะขององค์ประกอบ 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 updated: http://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview


4
ในความเป็นจริงattr.เป็นไวยากรณ์ที่จะบอก Angular2 เพื่อตั้งค่าการแสดงออกเป็นชื่อคุณลักษณะ มันไม่เหมือนกับการประเมิน JSON ฉันเดา ;-) ดูลิงก์นี้: angular.io/docs/ts/latest/guide/template-syntax.html
Thierry Templier

1
ขอบคุณที่ทำเคล็ดลับ นอกจากนี้ผมหมายถึงการวางngForบนแทนli ul
Vivendi

1
ฉันย้อนกลับการแก้ไขล่าสุดเพื่อให้มีทั้งคำตอบดั้งเดิมและค่ารหัสที่อัปเดตใหม่ ฉันค้นหาบางสิ่งที่เบต้าในช่วงต้นและเห็นว่าคำตอบนี้ได้รับการแก้ไขดังนั้นจึงไม่ได้นำไปใช้กับรุ่นเบต้าของ angular 2 อีกต่อไป
ps2goat

4
อัปเดต: 08/2017 <div * ngFor = "ปล่อยให้ฮีโร่ของฮีโร่ปล่อยให้ i = ดัชนี; trackBy: trackById">
Maxi

4
ตั้งแต่วันที่ 17 ต.ค. 2018 Angular 6 ใช้ * ngFor = "ให้ไอเท็มของรายการดัชนีเป็นฉัน" ดูคำตอบของลีโอด้านล่าง
เจล

318

ในเชิงมุม 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
นี่ไง! ทำงานตั้งแต่วันที่ 17 ต.ค. 2561 ขอบคุณ. (ทำไมพวกเขาถึงเปลี่ยนแปลงไวยากรณ์มันน่ารำคาญเหรอ
เจล

2
นี่เป็นคำตอบที่ดีกว่าและง่ายกว่าคำตอบแรก
Kenry Sanchez

2
index as iใช้งานได้ดีขอบคุณ แต่ไม่ได้*ngForหมายความว่าจะต้องทำซ้ำองค์ประกอบ (เช่น<li>ในกรณีนี้)? รหัสที่คุณแนะนำสร้าง<ul>rathers หลายตัวมากกว่าหลาย<li>s
Liran H

index as iสง่างามยิ่งกว่าlet i = index
Dabbbb

108

เพียงแค่อัปเดตสำหรับสิ่งนี้คำตอบของ Thierry ยังคงถูกต้อง แต่มีการอัปเดตเป็น Angular2 เกี่ยวกับ:

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

#i = indexตอนนี้ควรจะเป็นlet i = index

แก้ไข / UPDATE:

*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 / UPDATE

เชิงมุม 7/8

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

3
และ#itemควรเป็นlet item;-)
GünterZöchbauer

52

ฉันคิดว่ามันได้รับการตอบก่อนหน้านี้ แต่เพียงการแก้ไขถ้าคุณกำลังเติมรายการที่ไม่ได้เรียงลำดับ*ngForจะมาในองค์ประกอบที่คุณต้องการทำซ้ำ ดังนั้นจึงควรจะ <li>insdide นอกจากนี้ Angular2 ตอนนี้ใช้อนุญาตให้ประกาศตัวแปร

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

ฉันคิดว่ามันเป็นวิธีที่ดีที่สุดในการระบุคำสั่ง * ngFor ใน ul tag <ul * ngFor = "ให้ไอเท็มของรายการดัชนีเป็นฉัน" [attr.data-index] = "i"> <li> {{item} } </li> </ul>
bajran

1
หากคุณระบุ ngFor ในแท็ก ul จากนั้นเอนทิตีที่จะทำซ้ำจะเป็น ul แต่ที่นี่คุณไม่ต้องการที่จะทำซ้ำ ul คุณเพียงแค่ต้องการย้ำในองค์ประกอบรายการเช่น li
โมนิกา

21

คำตอบอื่น ๆ นั้นถูกต้อง แต่คุณสามารถละเว้น[attr.data-index]ทั้งหมดและเพียงแค่ใช้

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

2

คุณสามารถใช้[attr.data-index]โดยตรงเพื่อบันทึกดัชนีไปยังแอตทริบิวต์ data-index ซึ่งมีให้ใน Angular เวอร์ชัน 2 ขึ้นไป

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


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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.