export declare class EventEmitter<T> extends Subject<T> {
/**
* Creates an instance of [EventEmitter], which depending on [isAsync],
* delivers events synchronously or asynchronously.
*/
constructor(isAsync?: boolean);
emit(value: T): void;
/**
* @deprecated - use .emit(value) instead
*/
next(value: any): void;
subscribe(generatorOrNext?: any, error?: any, complete?: any): any;
}
在官方Angular 2 Typescript定义中,似乎没有办法静音或取消订阅EventEmitter。
随着页面使用相同的EventEmitter
,我随着时间的推移得到了回调答案 0 :(得分:36)
EventEmitter扩展了Subject。当您订阅某个主题时,您会得到Subscription
,以后可以用来取消订阅。
someOutput:EventEmitter = new EventEmitter();
...
this.subscription = someOutput.subscribe(...);
...
this.subscription.unsubscribe();
<强>提示强>
除EventEmitter
以外,请勿将@Output()
用于其他任何内容。 Angular不保证EventEmitter
将来会继续Subject
或甚至与Subject
类似的工作。
答案 1 :(得分:9)
因为EventEmitters应该only be used to emit events from components,因此不应该订阅它们,所以Angular不需要提供取消订阅的方法。
如果未在组件中使用输出属性,请使用Observable或Subject而不是EventEmitter。
也许他们应该将名称更改为OutputPropertyEmitter。
答案 2 :(得分:0)
正如GünterZöchbauer所述,您可以通过以下方式取消订阅EventEmitter:
someOutput:EventEmitter = new EventEmitter();
...
this.subscription = someOutput.subscribe(...);
由于Angular说您不应该使用它(摘自this帖子):
引用Rob Wormald的评论
[...] EventEmitter实际上是Angular抽象,应该是 仅用于在组件中发出自定义事件。 否则,就像其他库一样使用Rx。
这在EventEmitter的文档中确实很清楚。
由指令和组件使用以发出自定义事件。
相反,您应该使用Rxjs主题。 EventEmitter扩展了Rxjs主题,这意味着您几乎可以以相同的方式使用它。尽管必须使用“ subject.next()”函数代替“ eventEmitter.emit()”,但订阅和取消订阅的工作方式相同。