2016-02-20 147 views
5

我想建立一個組件上的字符串屬性在我的構造函數,但是當我嘗試這樣的事情角2參數傳遞到構造函數拋出異常DI

@Component({ 
    selector: 'wg-app', 
    templateUrl: 'templates/html/wg-app.html' 
}) 
export class AppComponent { 

    constructor(private state:string = 'joining'){ 

    } 
} 

我得到一個DI異常

EXCEPTION: No provider for String! (AppComponent -> String) 

很明顯,注入器試圖找到'字符串'提供程序,並且找不到任何。

這種類型的東西應該使用什麼樣的模式?例如。將初始參數傳遞給組件。

應該避免嗎?我應該注入最初的字符串嗎?

回答

15

您可以使用@Input()屬性。

<my-component [state]="'joining'"></my-component> 

export class AppComponent { 
    @Input() state: string; 
    constructor() { 
    console.log(this.state) // => undefined 
    } 
    ngOnInit() { 
    console.log(this.state) // => 'joining' 
    } 
} 

構造一般應只用於DI ...

但是,如果你真的需要它,你可以創建注射變量(plunker)

let REALLY_IMPORTANT_STRING = new OpaqueToken('REALLY_IMPORTANT_STRING'); 
bootstrap(AppComponent, [provide(REALLY_IMPORTANT_STRING, { useValue: '!' })]) 

export class AppComponent { 
    constructor(@Inject(REALLY_IMPORTANT_STRING) public state: REALLY_IMPORTANT_STRING) { 
    console.log(this.state) // => ! 
    } 
} 

簡單的選項是剛剛成立類別屬性:

export class AppComponent { 
    private state:string = 'joining'; 
    constructor() { 
    console.log(this.state) // => joining 
    } 
} 

正如@Mark指出的,另一個o ption是使用服務:

export class AppService { 
    public state:string = 'joining'; 
} 
export class AppComponent { 
    constructor(private service: AppService) { 
    console.log(this.service.state) // => joining 
    } 
} 
+0

呀,好像你不應該處理組件就像一個普通類 –

+0

那麼它不是一個普通類(:這是一類特殊的,可以做一些規律性的東西:P – Sasxa

+0

嘿耶,我覺得像傳遞一個字符串應該是可能的,雖然。我不應該在我的模板中初始化它 –

相關問題