如何取消订阅Angular 2中的EventEmitter?

时间:2016-04-08 08:03:04

标签: angular rxjs eventemitter

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

,我随着时间的推移得到了回调

3 个答案:

答案 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()”,但订阅和取消订阅的工作方式相同。