我在 Angular 服务中使用 EventEmitter 和 @Output,今天一位同事提到这不是一个好的做法。
注释@Output()
对服务没有影响。它用于告诉 Angular 模板编译器绑定一个Observable
到模板表达式。
如果我看到@Output()
在服务中,然后我会告诉开发人员将其删除。
EventEmitter
is an Observable
在服务中使用它没有副作用,但也没有好处。
您可以使用任何Observable
组件或服务中的发射器类型。我们有两个原因EventEmitter
。 1) 它早于 Angular 团队决定使用可观察量,他们认为可能需要自己的实现,2) 它可以在下一个 JavaScript 周期中发出值(可选设置)。
在某些边缘情况下,人们需要在下一个周期中发出更改,以避免更改检测出现问题。
保护您的可观察数据
@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.asObservable();
}
}
上面的方法更好,因为可以访问Subject.next(..)
是私人的。消费者只能订阅可观察的内容。
如果您遵循成分方法。它迫使你暴露你的发射器,这不是一个好主意。
@Injectable()
export class MyService {
@Output() // <<< has no effect
public events: EventEmitter<any> = new EventEmitter();
// ^^ makes the emitter public
}
组件需要具有如下属性public如果它们要在模板中使用,但服务则不然。