如何使用 ngFor 遍历数组的一部分?

Posted

技术标签:

【中文标题】如何使用 ngFor 遍历数组的一部分?【英文标题】:How do I loop over a slice of an array using ngFor? 【发布时间】:2022-01-19 23:56:43 【问题描述】:

我正在创建一个带有手风琴按钮的常见问题页面,在子标题下有一组按钮。我使用 faq.html 文件中的 ngFor 语句设计了它。

<h1>Frequently Asked Questions</h1>
<div *ngFor="let item of data; let i = index;">
    <button class="accordion" (click)="toggleAccordion($event, i)"> item.parentName </button>
    <div class="panel" *ngFor="let child of item.childProperties" hide="!item.isActive">
    <p> child.propertyName </p>
</div>

这是 faq.ts 文件的 sn-p。

import  Component, OnInit  from '@angular/core';

@Component(
  selector: 'app-faq',
  templateUrl: './faq.html',
  styleUrls: ['./faq.scss']
)
export class FaqComponent implements OnInit 
  data: any = [
    
      parentName: 'Question 1A',
      childProperties: [ propertyName: 'Answer 1A' ],
    ,
    
      parentName: 'Question 2A',
      childProperties: [ propertyName: 'Answer 2A' ],
    ,
    
      parentName: 'Question 3A',
      childProperties: [ propertyName: 'Answer 3A' ],
    ,
    
      parentName: 'Question 1B',
      childProperties: [ propertyName: 'Answer 1B' ],
    ,
    
      parentName: 'Question 2B',
      childProperties: [ propertyName: 'Answer 2B' ],
    ,
  ];

我想在 A 部分(问题 1A、2A 和 3A)和 B 部分(问题 1B 和 2B)上放置子标题。我想我可以在 faq.html 的 ngFor 语句中使用 slice,但是代码不会编译。

我试过这个切片管:

<div *ngFor="let item of data | slice:0:2; let i = index;">

我应该改变什么来编译和分解常见问题部分?切片管是要走的路吗?

【问题讨论】:

【参考方案1】:

我必须更改 html 才能以不同的方式访问属性并编译:

<div *ngFor="let item of data; let i = index;">
    <button class="accordion" (click)="toggleAccordion($event, i)"> item['parentName'] </button>
    <div class="panel" *ngFor="let child of item['childProperties'] | slice:0:2; let i = index;" hide="!item.isActive">
    <p> child['propertyName'] </p>
</div>

【讨论】:

【参考方案2】:

切片数据

这里的问题是切片管道以unknown 类型返回您的数据。有几种方法可以解决这个问题:

$任何

<p *ngFor="let item of data | slice:2:4">
   $any(item).parentName 
</p>

括号表示法

<p *ngFor="let item of data | slice:2:4">
   item['parentName'] 
</p>

一个函数

slicedData(data : any[]) : any[] 
  return data.slice(2,4)

<p *ngFor="let item of slicedData(data)">
   item['parentName'] 
</p>

您可能希望正确键入数据,而不是使用任何数据。毕竟它被称为 Typescript 是有原因的。

以下是Stackblitz 中的一些示例。

【讨论】:

谢谢。我会试试这个。【参考方案3】:

您可以添加一个*ngIf 并检查是否i &lt; 3

<h1>Frequently Asked Questions</h1>
<div *ngFor="let item of data; let i = index;">
  <ng-container *ngIf="i < 3">
    <button class="accordion" (click)="toggleAccordion($event, i)"> item.parentName </button>
    <div class="panel" *ngFor="let child of item.childProperties" hide="!item.isActive">
    <p> child.propertyName </p>
  </ng-container>
</div>

【讨论】:

【参考方案4】:

谢谢大家的帮助。我将 faq.html 更改为:

<h1>Frequently Asked Questions</h1>
<h2>General</h2>
<div *ngFor="let item of data; let i = index;">
  <ng-container *ngIf="i < 3">
    <button class="accordion" (click)="toggleAccordion($event, i)"> item.parentName </button>
    <div class="panel" hide="!item.isActive">
    <p> item.childName </p>
</div>

它成功了。

【讨论】:

以上是关于如何使用 ngFor 遍历数组的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

Angular *ngFor 循环遍历数组

Angular 4 ngFor使用HTML循环遍历对象数组

ngFor - 按索引打印数组项

Java 如何遍历数组里面的数据?

Javascript数组递归问题 - 遍历“部分”

PHP中如何使用foreach结构遍历数组?