web-dev-qa-db-ja.com

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;
}

Official Angular 2 TypeScript定義では、EventEmitterをミュートまたはサブスクライブ解除する方法がないようです。

ページが同じEventEmitterを使用するため、時間の経過とともにコールバックが発生しました

18
tom10271

EventEmitterはSubjectを拡張します。サブジェクトをサブスクライブすると、Subscriptionを取得します。これは後でサブスクライブ解除に使用できます。

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

ヒント
@Output() s以外にはEventEmitterを使用しないでください。 Angularは、EventEmitterSubjectを拡張し続けること、または将来的にSubjectと同様に動作することを保証しません。

38

EventEmitterは コンポーネントからイベントを発行するためにのみ使用される であり、したがってサブスクライブされるべきではないため、Angularがサブスクライブを解除する手段を提供する必要はありません。

コンポーネントで出力プロパティを使用していない場合は、EventEmitterの代わりにObservableまたはSubjectを使用します。

名前をOutputPropertyEmitterに変更する必要があるかもしれません。

10
Mark Rajcok