使用 Angular2 ngFor 索引

Posted

技术标签:

【中文标题】使用 Angular2 ngFor 索引【英文标题】:Using Angular2 ngFor index 【发布时间】:2017-08-22 22:58:36 【问题描述】:

我有这个代码:

<div class="row list-group">
  <div *ngFor="let product of products" >
    <app-product [product]="product"></app-product>
  </div>
</div>

我想知道有什么方法可以从存储桶中的数组中获取产品吗?像这样的:

<div class="list-group">
  <div *ngFor="products; index+3" >
    <div class="row">
      <app-product [product]="products[index]"></app-product>
      <app-product [product]="products[index+1]"></app-product>
      <app-product [product]="products[index+2]"></app-product>
    </div>
  </div>
</div>

这样我就可以连续拥有我需要的所有元素

UPD

感谢 Teddy Sterne,我最终得到了这个解决方案:

<div class="list-group">
  <div *ngFor="let product of products;let i = index">
    <div class="row" *ngIf="i%3===0">
      <app-product [product]="products[i]"></app-product>
      <div *ngIf="products[i + 1]">
        <app-product [product]="products[i + 1]"></app-product>
      </div>
      <div *ngIf="products[i + 2]">
        <app-product [product]="products[i + 2]"></app-product>
      </div>
    </div>
  </div>
</div>

【问题讨论】:

对于任何试图在网格中显示可变数量对象的人,您可能需要查看 mat-grid:material.angular.io/components/grid-list/overview。 (如果网站无法加载,请在新的隐身窗口中尝试。) 【参考方案1】:

Angular 没有开箱即用地提供此功能。我认为达​​到预期结果的最简单方法是仅在每三个索引上显示数据,如下所示:

<div class="list-group">
  <div *ngFor="let p of products; let idx = index" >
    <div class="row" *ngIf="idx % 3 === 0">
      <app-product [product]="products[idx]"></app-product>
      <app-product [product]="products[idx+1]"></app-product>
      <app-product [product]="products[idx+2]"></app-product>
    </div>
  </div>
</div>

Demo

【讨论】:

猜你需要对index+1index+2 元素进行边界检查。除此之外,它应该可以工作:) 如果指令可以处理undefined 应该没问题。否则是的,你可以在每一行添加一个*ngIf 来防止它。 @TeddySterne 仅供参考,演示链接无效。【参考方案2】:

对于索引试试这个:

控制器文件添加功能:

chunks(array, size) 
  let results = [];
  while (array.length) 
    results.push(array.splice(0, size));
  
  return results;
;

在你查看文件中:

<div *ngFor="let chunkProduct of chunks(products,3);" >
  <div class="row">
      <app-product *ngFor="let product of chunkProduct" [product]="product"></app-product>
  </div>
</div>

这适用于所有数字,而不仅仅是 %3 个数字。

@Teddy Sterne 的解决方案将在数字为 %3 的情况下有效 如果我们有 8 个产品,它将仅显示 6 个,最后 2 个将丢失,在此也会显示。

如果您检查元素并检查,它将为非 %3 索引创建额外的空白 div 标签,因为它将循环遍历每个产品,并且无论其索引是否为 %3,div 都会重复。

【讨论】:

那会爆炸——也就是给出索引超出范围的错误。 @VivekDoshi 假设 products 长度为 6。当 index 为 5 时,最后一条语句会发生什么? 它坏了。如果长度为 2,它将尝试访问索引 1*3==3,这显然超出了范围。【参考方案3】:

感谢泰迪·斯特恩的回答。

以下是它如何帮助我创建一个连续包含 7 个单元格的日历控件

<div class="container-fluid">
  <table class="table table-bordered">
    <ng-container *ngFor="let d of data; let i = index" >
      <tr *ngIf="i % 7 === 0">
        <td *ngFor="let x of [i,i+1,i+2,i+3,i+4,i+5,i+6]">
          data[x]
        </td>
      </tr>
    </ng-container>
  </table>      
</div> 

DEMO

https://stackblitz.com/edit/angular-1nhor2?embed=1&file=src/app/app.component.html

【讨论】:

以上是关于使用 Angular2 ngFor 索引的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2 ngFor 在索引 + 2 处错误地更改值

如何将 ngFor 循环的索引值传递给组件? [复制]

Angular 2 嵌套 *ngFor

不能在 *ngFor 内使用 *ngIF :angular2 [重复]

Angular2 NgFor在表达式中绑定数组

Angular2 单个 ngFor 用于多个数组