2016-04-08 4 views
7
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 Typcript, похоже, у него нет возможности отключить или отменить подписку на EventEmitter.Как отписаться от EventEmitter в Angular 2?

я получил обратный вызов в течение долгого времени, так как страницы используют один и тот же EventEmitter

+0

Покажите, как вы используете излучатель событий вместо – Chrillewoodz

ответ

17

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

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

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

+1

Эй, я верю, что ваш намек действует. Я считаю, что теперь невозможно отказаться от подписки на возвращаемое значение, можете ли вы подтвердить? –

+0

Он по-прежнему расширяет тему в v5.x, так что это все равно будет работать - https://github.com/angular/angular/blob/5.2.1/packages/core/src/event_emitter.ts#L10-L116 – mcgraphix

6

Поскольку EventEmitters должен only be used to emit events from components, и, следовательно, они не должны подписываться, нет необходимости в Угловом, чтобы предоставить средства для отмены подписки.

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

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

Смежные вопросы