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

Vivendi
источник

Ответы:

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>
Виджай Канауджиа
источник