如何在 angular 中的 *ngFor 列表的每个项目中切换特定元素的 class?

How can I toggle a class of a specific element in each item of an *ngFor list in angular?

我有一个父组件,它有一个 *ngFor 来呈现存储在数据库中的子组件项的所有实例。 默认情况下它们都是折叠的。 &可以通过调用一个toggle函数来展开,该函数传入子组件实例的点击事件

我想在父组件中添加一个按钮,用于切换父组件呈现的所有子组件实例。

父组件

<a class="btn btn-primary" (click)="ToggleAllVersions()">Expand All</a>
<version *ngFor="let version of versionService.versions | async" [version]="version"></version>

.

@Component({ selector: 'parent', templateUrl: './parent.component.html',})

ToggleAllVersions(){
    //add class to specific element in each version of versionService.versions
}

子组件

<div class="first-element">
     <div class="//toggle class here by calling ToggleAllVersions() in parent componant."></div>
</div>

如果您想在单击按钮时切换所有 子组件,您可以使用一个标志来表示所有项目的当前状态。

parent.component.ts

@Component({ /* ... */ })
export class ParentComp {
 areItemsCollapsed = true;

 ToggleAllVersions(){
  this.areItemsCollapsed = !this.areItemsCollapsed;
 }

}

parent.component.html

<a class="btn btn-primary" (click)="ToggleAllVersions()">Expand All</a>
<version 
 *ngFor="let version of versionService.versions | async"
 [ngClass]="{ 'is-collapsed': areItemsCollapsed }"
 [version]="version"
></version>

child.component.css

:host.is-collapsed {
 /* ... Styles applied when the item is collapsed */
}

如果要切换 class 以获取 特定元素 ,则必须更改父组件中的一些内容。 您可以使用一个映射对象,其中每个键是子组件的 id,值是 boolean,指示子组件是否应该折叠。

parent.component.ts

@Component({ /* ... */ })
export class ParentComp {
 collapsedItemsMap: { [k: string]: boolean | undefined } = {};

 toggleChildVersion (childItem){
  this.collapsedItemsMap[childItem.id] = !this.collapsedItemsMap[childItem.id]
 }
}

parent.component.html

<version 
 *ngFor="let version of versionService.versions | async"
 (click)="toggleChildVersion(version)"
 [ngClass]="{ 'is-collapsed': collapsedItemsMap[version.id }"
 [version]="version"
></version>

我最终做的是使用 @ViewChildren 如下

父组件

@ViewChildren(VersionComponent) private allVersions!: QueryList<VersionComponent>;
isAllExpanded = false;

  expandAndCollapse(){
    this.isAllExpanded = !this.isAllExpanded;
    this.allVersions.forEach(v=>v.isExpanded = this.isAllExpanded);
  }

(版本)组件

 isExpanded = false;

很有魅力!