2016-06-08 22 views
0

iterieren. Was ich erreichen möchte, ist für eine gegebene Komponenteninstanz, die ich über EventEmitter mit @Output verzieren möchte.Können wir über alle EventEmitter, die mit @Output() versehen sind, in Angular 2

Für z.B.

my-Komponente

@Component({ 
    moduleId: module.id, 
    selector: "my-component", 
    template: "<h1>My Component!!" 
    }) 
    export class MyComponent{ 
    @Output() emitter1: EventEmitter<any> = new EventEmitter<any>(); 
    @Output() emitter2: EventEmitter<any> = new EventEmitter<any>(); 
    } 

so kann sagen, dass ich diese Komponente dynamisch bin Laden wie unten,

this._cr.resolveComponent(MyComponent).then(cmpFactory => { 
     this.testComponentContainer.clear(); 
     let instance: any = this.testComponentContainer.createComponent(cmpFactory).instance; 

     // Here I want to iterate over EventEmitter dynamically 
     // So that I may bind to both emitter1 and emitter2 
    }); 

Kann ich das tun? Vielen Dank im Voraus !!

Antwort

1

Sie können sich die propMetadata Metadaten ansehen, um die dekorierte Ausgabe herauszufinden. Hier

ist ein Beispiel:

this._cr.resolveComponent(MyComponent).then(cmpFactory => { 
    this.testComponentContainer.clear(); 
    let instance: any = this.testComponentContainer.createComponent(cmpFactory).instance; 

    var propMetadata = Reflect.getMetadata('propMetadata', MyComponent); 
    var outputs = propMetadata.filter(metadata => { 
     return (metadata instanceof OutputMetadata); 
    }); 

    outputs.forEach(output => { 
     output.subscribe(event => { 
     // handle event 
     }); 
    }); 

    // Here I want to iterate over EventEmitter dynamically 
    // So that I may bind to both emitter1 and emitter2 
}); 

-Update von Madhu Ranjan Es gibt Probleme mit der oben genannten Code, aber es mir angedeutet, es wie unten richtig zu verwenden,

this._cr.resolveComponent(componentToTest).then(cmpFactory => { 
     this.testComponentContainer.clear(); 
     let instance: any = this.testComponentContainer.createComponent(cmpFactory).instance; 

     let propMetadata: any = Reflect.getMetadata('propMetadata', componentToTest); 
     let outputs: any = []; 

     for (let key in propMetadata) { 
      if (propMetadata.hasOwnProperty(key)) { 
       if (propMetadata[key].length > 0) { 
        let _hasOutput = propMetadata[key].filter(metadata => { 
         return (metadata instanceof OutputMetadata); 
        }); 

        if (_hasOutput && _hasOutput.length > 0) { 
         outputs.push(key); 
        } 
       } 
      } 
     } 

     outputs.forEach(output => { 
      instance[output].subscribe(event => { 
       // Logic to use event data.. 
      }); 
     }); 
    });