角度服务中的 EventEmitter 是好是坏?

Rez*_*eza 11 javascript observable eventemitter angular2-services angular

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

我发现这篇文章提到这是一种不好的做法,而且似乎主要是个人意见,而这个答案提到使用它是可以的。我找不到任何关于它的官方文件,所以如果有人知道官方答案,请发布。

关于EventEmitter 的官方文档

Rea*_*lar 11

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

该注释@Output()对服务没有影响。它用于告诉 Angular 模板编译器将 an 绑定Observable到模板表达式。

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

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

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

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

保护您的可观察数据

 @Injectable()
 export class MyService {
       public events: Subject<any> = new Subject();
 }
Run Code Online (Sandbox Code Playgroud)

上述服务的问题在于任何人都可以从公众那里发出值events。您希望您的服务成为处理发出值的唯一代码。

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

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

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

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

如果要在模板中使用组件,则需要将其属性设置为公共,但服务则不然。