ngFor với chỉ số là giá trị trong thuộc tính


571

Tôi có một ngForvòng lặp đơn giản cũng theo dõi hiện tại index. Tôi muốn lưu trữ indexgiá trị đó trong một thuộc tính để tôi có thể in nó. Nhưng tôi không thể hiểu làm thế nào điều này hoạt động.

Tôi về cơ bản có điều này:

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

Tôi muốn lưu trữ giá trị của #itrong thuộc tính data-index. Tôi đã thử một vài phương pháp nhưng không có phương pháp nào hiệu quả.

Tôi có một bản demo ở đây: http://plnkr.co/edit/EXpOKAEIFlI9QwuRcZqp?p=preview

Làm thế nào tôi có thể lưu trữ indexgiá trị trong data-indexthuộc tính?

Câu trả lời:


1001

Tôi sẽ sử dụng cú pháp này để đặt giá trị chỉ mục thành một thuộc tính của phần tử HTML:

Góc> = 2

Bạn phải sử dụng letđể khai báo giá trị chứ không phải #.

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

Góc = 1

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

Dưới đây là bản cập nhật plunkr: http://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview .


4
Trong thực tế, đây attr.là một cú pháp để báo cho Angular2 đặt giá trị của biểu thức thành tên thuộc tính. Nó không giống như đánh giá JSON, tôi đoán vậy ;-) Xem liên kết này: angular.io/docs/ts/latest/guide/template-syntax.html
Thierry Templier

1
Cảm ơn, đó là mẹo. Ngoài ra, tôi có nghĩa là để đặt ngFortrên lithay vì ul.
Vivendi

1
Tôi đã khôi phục chỉnh sửa gần đây để có cả câu trả lời ban đầu và giá trị mã được cập nhật mới. Tôi đã tìm kiếm một số nội dung beta sớm và thấy rằng câu trả lời này đã được sửa đổi, vì vậy nó không còn được áp dụng cho phiên bản beta của angular 2.
ps2goat

4
CẬP NHẬT: 08/2017 <div * ngFor = "let hero of hero; let i = index; trackBy: trackById">
Maxi

4
kể từ ngày 17 tháng 10 năm 2018 Angular 6 đang sử dụng * ngFor = "let item of item; index as i" Xem câu trả lời của Leo bên dưới.
Gel

318

Trong góc 5/6/7/8:

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

Trong các phiên bản cũ hơn

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

Angular.io ▸ API NgForOf

Ví dụ kiểm tra đơn vị

Một ví dụ thú vị khác


11
đây là nó! Làm việc kể từ ngày 17 tháng 10 năm 2018. Cảm ơn bạn. (tại sao họ cứ thay đổi cú pháp, thật khó chịu?
Gel

2
Đây là một câu trả lời tốt hơn và đơn giản hơn câu trả lời đầu tiên.
Kenry Sanchez

2
index as ilàm việc tuyệt vời, cảm ơn bạn. Nhưng không phải *ngForlà có nghĩa là đi vào phần tử được lặp lại (ví dụ như <li>trong trường hợp này)? Mã bạn đề xuất tạo ra nhiều <ul>rathers hơn nhiều <li>s.
Liran H

index as ithanh lịch hơnlet i = index
Dabbbb.

108

Chỉ cần một bản cập nhật cho điều này, câu trả lời của Thierry vẫn đúng, nhưng đã có một bản cập nhật cho Angular2 liên quan đến:

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

Các #i = indexbây giờ sẽ đượclet i = index

CHỈNH SỬA / CẬP NHẬT:

Các *ngFornên được trên các yếu tố bạn đang muốn foreach, vì vậy trong ví dụ này nó nên là:

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

CHỈNH SỬA / CẬP NHẬT

Góc 5

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

EDIIT / CẬP NHẬT

Góc 7/8

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

3
#itemnên là let item;-)
Günter Zöchbauer

52

Tôi nghĩ rằng nó đã được trả lời trước đó, nhưng chỉ là một sự điều chỉnh nếu bạn đang điền vào một danh sách không có thứ tự, *ngFornó sẽ xuất hiện trong phần tử mà bạn muốn lặp lại. Vì vậy, nó nên được insdide <li>. Ngoài ra, Angular2 hiện sử dụng let để khai báo một biến.

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

Tôi nghĩ rằng cách tốt nhất là chỉ định lệnh * ngFor trong thẻ ul <ul * ngFor = "let item of item; index as i" [attr.data-index] = "i"> <li> {{item} } </ li> </ ul>
bajran

1
Nếu bạn chỉ định ngFor trong thẻ ul, thì thực thể sẽ được lặp lại sẽ là ul, nhưng ở đây bạn không muốn lặp lại ul, bạn chỉ muốn lặp lại các thành phần danh sách tức là li.
monica

21

Các câu trả lời khác là đúng nhưng bạn có thể bỏ qua [attr.data-index]hoàn toàn và chỉ cần sử dụng

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

2

Bạn có thể sử dụng trực tiếp [attr.data-index] để lưu chỉ mục vào thuộc tính chỉ mục dữ liệu có sẵn trong phiên bản Angular 2 trở lên.

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

1

Thử cái này

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

0

với phân trang 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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.