在角度服务中的EventEmitter,好还是坏?

时间:2018-06-01 16:32:55

标签: javascript angular observable angular2-services eventemitter

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

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

关于EventEmittter

的官方文档

1 个答案:

答案 0 :(得分:1)

  

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

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

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

EventEmitterObservable,在服务中使用它没有任何副作用,但也没有任何好处。

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

有些人需要在下一个周期发出变化,以避免变更检测出现问题。

保护您的Observables

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

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

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

以上情况更好,因为对Subject.next(..)的访问是私有的。消费者只能订阅观察者。

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

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

组件需要将其属性设置为 public (如果要在模板中使用它们),但服务并非如此。