2016-06-11 3 views
3

In Bezug auf Angular2 Richtlinie wollte ich outputs anstelle von @Output verwenden, weil ich viele benutzerdefinierte Ereignisse habe und DRY behalten wollte.eckige2 Direktive `Kann Eigenschaft 'subscribe' von undefined nicht mit Ausgabenmetadaten lesen

Allerdings habe ich TypeError: Cannot read property 'subscribe' of undefined, und ich weiß nicht, warum es passiert.

http://plnkr.co/edit/SFL9fo?p=preview

import { Directive } from "@angular/core"; 

@Directive({ 
    selector: '[my-directive]', 
    outputs: ['myEvent'] 
}) 
export class MyDirective { 
    constructor() { 
    console.log('>>>>>>>>> this.myEvent', this.myEvent); 
    } 
} 

enter image description here

Und das ist App-Komponente, die diese Anweisung

enter image description here

Antwort

12

Sie müssen verwendet die Ausgabe initialisieren:

import { Directive } from "@angular/core"; 

@Directive({ 
    selector: '[my-directive]', 
    outputs: ['myEvent'] 
}) 
export class MyDirective { 
    myEvent:EventEmitter<any> = new EventEmitter(); // <----- 

    constructor() { 
    console.log('>>>>>>>>> this.myEvent', this.myEvent); 
    } 
} 

Sie könnten auch die @HostListener Dekorateur verwenden:

@Directive({ 
    selector: '[my-directive]' 
}) 
export class MyDirective { 
    @HostListener('myEvent') 
    myEvent:EventEmitter<any> = new EventEmitter(); // <----- 

    constructor() { 
    console.log('>>>>>>>>> this.myEvent', this.myEvent); 
    } 
} 
+0

Danke, ich dachte, das automatisch gemacht wurde. – allenhwkim

+0

Gern geschehen! In der Tat müssen Sie es selbst initialisieren ;-) –