gpt4 book ai didi

angular - 在 ngFor 循环中动态地向元素添加一个类

转载 作者:太空狗 更新时间:2023-10-29 17:53:14 26 4
gpt4 key购买 nike

我有以下模板:

<app-subscriber 
*ngFor="let stream of streams"
[stream]="stream"
[session]="session"
(speakEvents)='onSpeakEvent($event)'>
</app-subscriber>

父组件监听来自 speakEvents 的事件:

onSpeakEvent(event: any) {
if (event.type === 'speaking') {
this.spotlightSubscriber = event.emitter;
//The component emitting the event, from the ngFor repeat list.
//Add class to this.spotlightSubscriber
}
else if (event.type === 'stopped_speaking') {
//Remove class to this.spotlightSubscriber
}
}

如何在 *ngFor 循环中向事件发射器动态添加/删除 CSS 类?

我需要一次将类添加到一个元素。

最佳答案

基本上有两种方法可以实现您在此处尝试实现的目标。

方法一:

创建一个属性 (indexToAppendClassTo) 来跟踪您要应用该类的索引。当子组件发出事件时,从该 indexToAppendClassTo 列表中添加或删除发出的流的索引。并根据此 indexToAppendClassTo 列表中流的索引的存在来应用该类。

在类里面:

import { Component } from '@angular/core';

@Component({...})
export class AppComponent {
...
indexToAppendClassTo: any[] = [];

onSpeakEvent(event: any, index) {
// Approach 1
if (event.type === 'speaking') {
this.spotlightSubscriber = event.emitter;
if(this.indexToAppendClassTo.indexOf(index) === -1)
this.indexToAppendClassTo.push(index);
} else if (event.type === 'stopped_speaking') {
if(this.indexToAppendClassTo.indexOf(index) > -1)
this.indexToAppendClassTo.splice(index, 1);
}
}
}

在模板中:

<app-subscriber 
*ngFor="let stream of streams; let i = index;"
[stream]="stream"
[session]="session"
(speakEvents)='onSpeakEvent($event, i)'
[ngClass]="indexToAppendClassTo.includes(i) ? 'color' : ''">
</app-subscriber>

方法二

正如其他人所提到的,如果您愿意将某些属性作为决定是否应用该类的发出事件的一部分发送,则从您的子组件执行此操作,然后传递更新的 来自 Child 作为发出的 $event 数据。这样你就不必不必要地管理 indexToAppendClassTo 列表:

在父组件类中:

import { Component } from '@angular/core';

@Component({...})
export class AppComponent {
...

onSpeakEvent(event: any) {
// Approach 2
const indexOfElement = this.streams.findIndex(strem => strem.name === event.name);
this.streams[indexOfElement] = { ...event };
}
}

在父组件模板中:

<app-subscriber 
*ngFor="let stream of streams"
[stream]="stream"
[session]="session"
(speakEvents)='onSpeakEvent($event)'
[ngClass]="stream.type === 'speaking' ? 'color': ''">
</app-subscriber>

在子组件类中:

import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';

@Component({
selector: 'app-subscriber',
templateUrl: './subscriber.component.html',
styleUrls: ['./subscriber.component.css']
})
export class SubscriberComponent implements OnInit {

@Input() stream;
@Input() session;
@Output() speakEvents: EventEmitter<any> = new EventEmitter<any>();

...

onClick() {
this.speakEvents.emit({ ...this.stream, type: 'type of the stream here' });
}

...

}

在子组件模板中:

<button (click)="onClick()">{{stream.name}}</button>

这是一个 Working Sample StackBlitz两种方法供您引用。

关于angular - 在 ngFor 循环中动态地向元素添加一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53231277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com