2016-04-20 93 views
3

我創建了一個抽象超類來處理我的應用程序中各種表單組件的泛型因子。父類中的Angular2 EventEmitter

出於某種原因,我無法正確地捕獲派生類發出的事件,這些派生類的EventEmitter在超類中聲明。

超類:

export abstract class Form<T> implements OnInit { 
    @Output() submitted : EventEmitter<T> = new EventEmitter<T>(); 
    fb     : FormBuilder  = new FormBuilder(); 
    formModel   : ControlGroup; 

    abstract ngOnInit() : any; 
} 

派生:

封裝元件的
export class LoginFormComponent extends Form<Login> { 

    credentials : Login = new Login(); 

    constructor() { 
     super(); 
    } 

    doLogin() { 
     this.submitted.emit(this.credentials); 
    } 
} 

HTML:

<login-form (submitted)="login($event)"></login-form>\ 

當我將EventEmitter移動到派生類時,一切都像魅力一樣。 我需要更改什麼才能使其工作?

回答

2

Angular不承認超類中的裝飾器。

您可以使用@Component()註釋

@Component({ 
    selector: '...', 
    outputs: ['submitted'], 
    inputs: ['...'] 
}) 

參見https://github.com/angular/angular/issues/5415

+0

我沒有在繼承類'@ Component'裝飾,因爲它是'abstract'啓用它們。我仍然可以使用此解決方法嗎? –

+1

您需要將它添加到實際用作組件的類上,它在其他地方沒有任何效果。另外,@Input()和@Output()裝飾器在超類中是多餘的(至少在Angular團隊決定在超類中支持它們的時候) –

0

問題是@Component裝飾器不支持繼承(在父類中定義的元素)。它僅考慮當前裝飾類中定義的元素。