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атрибуте?

Ответы:


1003

Я бы использовал этот синтаксис для установки значения индекса в атрибут элемента 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>

Вот обновленный план: http://plnkr.co/edit/LiCeyKGUapS5JKkRWnUJ?p=preview .


4
Фактически, attr.это синтаксис, который сообщает Angular2, что в качестве значения выражения указывается имя атрибута. Я думаю, это не просто оценка JSON ;-) Смотрите эту ссылку: angular.io/docs/ts/latest/guide/template-syntax.html
— Тьерри

1
Спасибо, это делает трюк. Кроме того , я хотел поставить ngForна liвместо ul.
— Вивенди

1
Я откатил недавнее редактирование, чтобы получить как исходный ответ, так и новое обновленное значение кода. Я искал некоторые ранние бета-версии и увидел, что этот ответ был изменен, поэтому он больше не применяется к бета-версии angular 2.
— ps2goat

4
ОБНОВЛЕНИЕ: 08/2017 <div * ngFor = "let hero of heroes; let i = index; trackBy: trackById">
— Макси

4
по состоянию на 17 октября 2018 года Angular 6 использует * ngFor = "let item of items; index as i" См. ответ Лео ниже.
— Гель

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 октября 2018 года. Спасибо. (почему они продолжают менять синтаксис, так раздражает?
— Гель

2
это лучший и простой ответ, чем первый.
— Кенри Санчес

2
index as iотлично работает, спасибо. Но не *ngForозначает ли это повторение элемента (например, <li>в данном случае)? Код, который вы предложили, создает несколько <ul>s, а не несколько <li>s.
— Лиран Х

index as iэлегантнееlet i = index
— Dabbbb.

108

Просто обновление к этому, ответ Тьерри все еще правильный, но было обновление для Angular2 в отношении:

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

Теперь #i = indexдолжно бытьlet i = index

EDIT / UPDATE:

Элемент *ngForдолжен быть в элементе, который вы хотите использовать, поэтому для этого примера это должно быть:

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

EDIT / UPDATE

Угловой 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;-)
— Гюнтер Цохбауэр

52

Я думаю, что на него уже был дан ответ, но только для исправления, если вы заполняете неупорядоченный список, он *ngForбудет добавлен в элемент, который вы хотите повторить. Так и должно быть внутри <li>. Кроме того, Angular2 теперь использует let для объявления переменной.

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

Я думаю, что лучше всего указывать директиву * ngFor в теге ul <ul * ngFor = "let item of items; index as i" [attr.data-index] = "i"> <li> {{item} } </ li> </ ul>
— Баджран

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>

1

Попробуй это

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

0

с пагинацией

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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.