【问题标题】:EventEmitter in angular services, good or bad?角度服务中的EventEmitter,好还是坏?
【发布时间】:2018-11-11 20:20:42
【问题描述】:

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

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

关于EventEmittter的官方文档

【问题讨论】:

  • 在 Angular 服务中,你最好只使用 subject 我会想到的。当然,我什至看不到在服务中添加@Output 的好处
  • 输入和输出应该用于绑定到组件的属性/事件(从 HTML 定位它们),而不是在服务中。如上所述,最好有一个可以通过 get 函数或其他东西检索的主题或可观察对象。
  • 我想知道为什么我的问题得到了反对票和接近票,而几乎相同的问题得到了 132 票赞成stackoverflow.com/questions/36076700/…
  • 这是不常见的,因为首选普通主题。 EventEmitter 是一个增强的 Subject,所以它可以工作,但是为什么要把事情复杂化呢?
  • @bc1105 谢谢,与BehaviorSubject 和Subject 相比,使用@output 更简单、更简洁

标签: javascript angular observable angular2-services eventemitter


【解决方案1】:

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

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

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

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

您可以在组件或服务中使用任何Observable 类型的发射器。我们有EventEmitter 的原因有两个。 1) 它早于 Angular 团队决定使用 observables 的决定,他们认为他们可能需要自己的实现,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.asObservable();
       }
 }

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

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

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

如果要在模板中使用组件,则需要将其属性设为 public,但对于服务则不是这样。

【讨论】:

  • return this._event; 应该是 return this._event.asObservable(); 或者您可以将其转换为 Subject 并调用 next
猜你喜欢
  • 2018-02-10
  • 2018-07-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多