gpt4 book ai didi

javascript - Angular 服务中的 EventEmitter 是好是坏?

转载 作者:行者123 更新时间:2023-12-01 02:00:25 25 4
gpt4 key购买 nike

我在 Angular 服务中使用 EventEmitter@Output,今天一位同事提到这不是一个好的做法。

我找到了这个post提到这是一个不好的做法,似乎主要是个人观点,而这个answer提到可以使用它。我找不到任何关于它的官方文档,所以如果有人知道官方答案,请发布。

关于EventEmittter的官方文档

最佳答案

I was using EventEmitter and @Output in Angular services, today one of the coleagues mentioned it's not a good practice.

注释@Output()在服务中没有效果。它用于告诉 Angular 模板编译器将 Observable 绑定(bind)到模板表达式。

如果我在服务中看到 @Output(),那么我会告诉开发人员将其删除。

EventEmitter 是一个 Observable,在服务中使用它没有副作用,但也没有任何好处。

您可以在组件或服务中使用任何Observable类型的发射器。我们有 EventEmitter 的原因有两个。 1) 它早于 Angular 团队决定使用可观察量,他们认为可能需要自己的实现,2) 它可以在下一个 JavaScript 周期中发出值(可选设置)。

在某些边缘情况下,人们需要在下一个周期中发出更改,以避免更改检测出现问题。

保护您的可观察对象

 @Injectable()
export class MyService {
public events: Subject<any> = new Subject();
}

上述服务的问题是任何人都可以从公共(public)事件发出值。您希望您的服务成为处理发出值的唯一代码。

 @Injectable()
export class MyService {
private _events: Subject<any> = new Subject();
public get events(): Observable<any> {
return this._event.asObservable();
}
}

上面的方法更好,因为对 Subject.next(..) 的访问是私有(private)的。消费者只能订阅可观察的内容。

如果您遵循组件方法。它迫使您暴露发射器,这不是一个好主意。

@Injectable()
export class MyService {
@Output() // <<< has no effect
public events: EventEmitter<any> = new EventEmitter();
// ^^ makes the emitter public
}

如果组件要在模板中使用,则需要将其属性设置为公共(public),但服务的情况并非如此。

关于javascript - Angular 服务中的 EventEmitter 是好是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50647693/

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