2015-10-30 33 views
9

Nel metodo ngOnInit di un componente, i valori @Input sono stati associati in modo da poter controllare tali proprietà sul componente, ma non sembra essere un modo per controllare i binding di evento @Output. Voglio essere in grado di sapere se @Output è stato cablato sul componente o meno.Esiste un modo per verificare la presenza di @Output da un componente in Angular 2?

(usando angolare 2 beta 2 e dattiloscritto)

import {Component, Output, EventEmitter} from 'angular2/core'; 

@Component({ 
    selector: 'sample', 
    template: `<p>a sample</p>` 
}) 
export class SampleComponent { 
    @Output() cancel = new EventEmitter(); 

    ngOnInit() { 
     // would like to check and see if cancel was used 
     // on the element <sample (cancel)="doSomething()"></sample> 
     // or not <sample></sample> 
    } 
} 

risposta

16

stesso approccio user1448982 ma senza usare la ObservableWrapper che è destinato a essere il codice piattaforma che non è esposto per l'uso tramite l'api.

(Usando angolare 2 RC1 e dattiloscritto)
Nota: Questo solo iniziato a lavorare da 2.0.0-beta.16 e una maggiore

import {Component, Output, EventEmitter} from '@angular/core'; 

@Component({ 
    selector: 'sample', 
    template: `<p>a sample</p>` 
}) 
export class SampleComponent { 
    @Output() cancel = new EventEmitter(); 
    private isCancelUsed = false; 

    ngOnInit() { 
     this.isCancelUsed = this.cancel.observers.length > 0; 
    } 
} 

Plunker

Il metodo ObservableWrapper.hasSubscribers fa questa linea internamente, quindi puoi fare la stessa cosa qui.

Quando si utilizza dattiloscritto si otterrà un errore di tempo transpile se angolare finisce mai per cambiare la EventEmitter da un Subject (che fa parte Observable, in tal modo la proprietà .observers).

3

Il seguente codice dovrebbe funzionare:

import {Component, Output, EventEmitter, OnInit} from 'angular2/core'; 
import {ObservableWrapper} from 'angular2/src/facade/async'; 

@Component({ 
    selector: 'sample', 
    template: `<p>a sample</p>` 
}) 
export class SampleComponent implements OnInit { 
    @Output() cancel: EventEmitter<any> = new EventEmitter(); 

    private isCancelUsed: boolean; 

    ngOnInit(): void { 
     this.isCancelUsed = ObservableWrapper.hasSubscribers(this.cancel); 
    } 
} 
+0

Non fare affidamento su questo però. Il team di Angular non garantisce che "EventEmitter" continui a estendere "Observable" –

Problemi correlati