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

How to unsubscribe from EventEmitter in Angular 2?

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,我得到了回调

EventEmitter 扩展了主题。当您订阅一个主题时,您会得到一个 Subscription,您以后可以用它来取消订阅。

someOutput:EventEmitter = new EventEmitter();
...
this.subscription = someOutput.subscribe(...);
...
this.subscription.unsubscribe();

提示
不要将 EventEmitter 用于除 @Output() 之外的任何其他内容。 Angular 不保证 EventEmitter 会继续扩展 Subject 或什至在未来类似于 Subject 工作。

因为 EventEmitter 应该 ,因此不应订阅它们,因此 Angular 不需要提供取消订阅的方法。

如果您没有在组件中使用输出 属性,请使用 Observable 或 Subject 而不是 EventEmitter。

也许他们应该将名称更改为 OutputPropertyEmitter。

如 Günter Zöchbauer 所述,您可以按以下方式取消订阅 EventEmitter:

someOutput: EventEmitter = new EventEmitter();
...
this.subscription = someOutput.subscribe(...);
...
this.subscription.unsubscribe();

因为 Angular 说你不应该将 EventEmitter 用于 @Output 以外的东西(取自 post):

Quoting a comment from Rob Wormald

[...] 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.

相反,您应该使用 Rxjs 主题。 EventEmitter 扩展了 Rxjs Subject,这意味着您几乎可以以相同的方式使用它。虽然您必须使用 "subject.next()" 函数而不是 "eventEmitter.emit()",但订阅和取消订阅的工作方式相同。

someOutput: EventEmitter = new Subject();
...
this.subscription = someOutput.subscribe(...);
...
this.subscription.unsubscribe();