2016-04-08 27 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; 
} 

Nella definizione ufficiale di Angular 2 Typescript, sembra che non sia possibile disattivare o annullare l'iscrizione da EventEmitter.Come annullare l'iscrizione a EventEmitter in Angular 2?

ho avuto richiamata nel corso del tempo come pagine usano lo stesso EventEmitter

+0

Mostra come stai utilizzando l'emettitore di eventi invece – Chrillewoodz

risposta

17

EventEmitter estende Soggetto. Quando ti iscrivi a un argomento ottieni un Subscription che puoi utilizzare in seguito per annullare l'iscrizione.

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

Suggerimento
Non utilizzare EventEmitter per niente altro, ma @Output() s. Angular non garantisce che EventEmitter manterrà l'estensione Subject o addirittura funzionerà in modo simile a Subject in futuro.

+1

Ehi, credo che il tuo suggerimento sia ora in vigore. Credo che sia ora impossibile annullare l'iscrizione al valore restituito, puoi confermare? –

+0

Estende ancora Oggetto in v5.x, quindi funzionerà ancora: https://github.com/angular/angular/blob/5.2.1/packages/core/src/event_emitter.ts#L10-L116 – mcgraphix

6

Poiché EventEmitters deve only be used to emit events from components e quindi non devono essere sottoscritti, non è necessario che Angular fornisca un mezzo per annullare l'iscrizione.

Se non si utilizza una proprietà di output in un componente, utilizzare un Observable o un Subject invece di EventEmitter.

Forse dovrebbero cambiare il nome in OutputPropertyEmitter.