Как отписаться от EventEmitter в 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


person tom10271    schedule 08.04.2016    source источник
comment
Покажите, как вы используете эмиттер событий вместо этого   -  person Chrillewoodz    schedule 08.04.2016


Ответы (3)


EventEmitter расширяет Subject. Когда вы подписываетесь на тему, вы получаете Subscription, который позже можно использовать для отказа от подписки.

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

Совет
Не используйте EventEmitter ни для чего другого, кроме @Output(). Angular не гарантирует, что EventEmitter продолжит расширять Subject или даже будет работать аналогично Subject в будущем.

person Günter Zöchbauer    schedule 08.04.2016
comment
Эй, я считаю, что ваш намек в силе сейчас. Я считаю, что теперь невозможно отписаться от возвращенного значения, вы можете подтвердить? - person Mathijs Segers; 01.11.2016
comment
Он по-прежнему расширяет тему в версии 5.x, так что это все еще будет работать - github.com/angular/angular/blob/5.2.1/packages/core/src/ - person mcgraphix; 22.01.2018

Поскольку EventEmitters следует использовать только для отправки событий из компонентов, и, следовательно, на них не следует подписываться, в Angular нет необходимости предоставлять средство для отказа от подписки.

Если вы не используете выходное свойство в компоненте, используйте Observable или Subject вместо EventEmitter.

Возможно, им следует изменить имя на OutputPropertyEmitter.

person Mark Rajcok    schedule 08.04.2016
comment
Можете ли вы сказать мне, как я могу использовать Observable или Subject в этом случае? - person Anand Gupta; 24.03.2018

Как упомянул Гюнтер Цохбауэр, вы можете отказаться от подписки на EventEmitter следующим образом:

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

Поскольку Angular говорит, что вы не должны использовать EventEmitter для вещей, отличных от @Output (взято из этот пост):

Цитирование комментария Роба Вормолда

[...] EventEmitter на самом деле является абстракцией Angular, и его следует использовать в основном только для создания пользовательских событий в компонентах. В противном случае просто используйте Rx, как если бы это была любая другая библиотека.

Это очень четко указано в документации EventEmitter.

Используйте директивы и компоненты для генерации пользовательских событий.

Вместо этого вы должны использовать тему Rxjs. EventEmitter расширяет тему Rxjs, что означает, что вы можете использовать его таким же образом. Хотя вы должны использовать функцию subject.next() вместо eventEmitter.emit(), подписка и отмена подписки работают одинаково.

someOutput: EventEmitter = new Subject();
...
this.subscription = someOutput.subscribe(...);
...
this.subscription.unsubscribe();
person Jeremias Nater    schedule 12.11.2020