用户在他的服务中使用EventEmitter,但他在 comment建议
不要使用它,并直接在他的服务中使用Observable。
我也读这个
question
其中解决方案建议将EventEmitter传递给子进程并订阅它。
我的问题是:我应该,还是我不应该手动订阅一个EventEmitter?我应该如何使用它?
EventEmitter是一个angular2抽象,它的唯一目的是在组件中发出事件。从Rob Wormald引用一个comment
[…] EventEmitter is really an Angular abstraction,and should be used pretty much only for emitting custom Events in components. Otherwise,just use Rx as if it was any other library.
这在EventEmitter的文档中非常清楚。
Use by directives and components to emit custom Events.
使用它有什么问题?
Angular2永远不会保证我们EventEmitter将继续作为一个Observable。这意味着重构我们的代码,如果它改变。唯一必须访问的API是emit()方法。我们不应该手动订阅一个EventEmitter。
上面所有的说明在这个Ward Bell的comment(推荐阅读文章,和answer的那个意见)中更清楚。报价参考
Do NOT count on EventEmitter continuing to be an Observable!
Do NOT count on those Observable operators being there in the future!
These will be deprecated soon and probably removed before release.
Use EventEmitter only for event binding between a child and parent component. Do not subscribe to it. Do not call any of those methods. Only call
eve.emit()
那么,如何正确使用呢?
只需使用它从你的组件发出事件。看看下面的例子。
@Component({ selector : 'child',template : ` <button (click)="sendNotification()">Notify my parent!</button> ` }) class Child { @Output() notifyParent: EventEmitter<any> = new EventEmitter(); sendNotification() { this.notifyParent.emit('Some value to send to the parent'); } } @Component({ selector : 'parent',template : ` <child (notifyParent)="getNotification($event)"></child> `,directives : [Child] }) class Parent { getNotification(evt) { // Do something with the notification (evt) sent by the child! } }
如何不使用呢?
class MyService { @Output() myServiceEvent : EventEmitter<any> = new EventEmitter(); }
停在那里…你已经错了…
希望这两个简单的例子将澄清EventEmitter的正确使用。
TL; DR答案:
不,不要手动订阅,不要在服务中使用它们。使用它们,如文档中所示仅用于在组件中发出事件。不要打败角的抽象。