2016-03-14 260 views
1

我甚至不知道這是可能的打字稿,但我想從一個類繼承的功能,如:打字稿功能繼承

import {Component, AfterViewInit, ElementRef} from 'angular2/core'; 

@Component({}) 
class Class1 { 
    name: string; 
    constructor(private el: ElementRef) {} 

    private setName() { 
    this.name = "test"; 
    } 

    ngAfterViewInit() { 
    this.setName(); 
    } 
} 

@Component({ 
    selector: 'test' 
}) 
export class Class2 extends Class1 { 
    ngAfterViewInit() { 
    super.ngAfterViewInit(); 
    console.log(this.name); 
    } 
} 

,但我發現了以下錯誤在調用setName()函數時在控制檯中:

EXCEPTION: TypeError: this.el is undefined

爲什麼不能正常工作?

+0

的的setName()函數居然是:'this.name = this.el.nativeElement.firstChild;' – danbsb

回答

0

構造函數沒有被繼承。你需要在每個子類

@Component({ 
    selector: 'test' 
}) 
export class Class2 extends Class1 { 
    constructor(el: ElementRef) { 
    super(el); 
    } 

    ngAfterViewInit() { 
    super.ngAfterViewInit(); 
    console.log(this.name); 
    } 
} 
0

考慮將el的範圍更新爲protected,這意味着它可以被聲明的類和任何派生類訪問。

// before 
constructor(private el: ElementRef) {} 

// after 
constructor(protected el: ElementRef) {} 
4

Constructors are not inherited.

他們來定義它們。下面的示例顯示了這一點:

class Parent { 
    constructor(foo:number){} 
} 
class Child extends Parent {  
} 

const child1 = new Child(); // Error! 
const child2 = new Child(123); // OKAY! 

但這角

但是他們沒有分析了依賴注入。這意味着你的子類的構造函數不會被調用與父類預期相同的參數(在你的情況下是`el)。您需要指定每個子類上的所有元素。所以偶然正確的代碼是一個從接受的答案:

@Component({ 
    selector: 'test' 
}) 
export class Class2 extends Class1 { 
    constructor(el: ElementRef) { 
    super(el); 
    } 
}