2017-05-17 45 views
2

最近我碰到的問題InjectionToken,即在模塊聲明@Inject()在模塊InjectionToken宣告失敗,在angular2

import {InjectionToken, NgModule} from '@angular/core'; 
import {SampleComponent} from './sample.component'; 

export let SOME_TOKEN = new InjectionToken<string>('someToken'); 

@NgModule({ 
    declarations: [SampleComponent], 
    providers: [ 
    {provide: SOME_TOKEN, useValue: 'Some value'} 
    ] 
}) 
export class SampleModule { 
} 

和組件類:

import {Component, Inject, OnInit} from '@angular/core'; 
import {SOME_TOKEN} from './sample.module'; 

@Component({ 
    selector: 'sample-component', 
    templateUrl: './sample.component.html', 
    styleUrls: ['./sample.component.scss'] 
}) 
export class SampleComponent implements OnInit { 

    constructor(@Inject(SOME_TOKEN) private someValue: string) { } 

    ngOnInit() { 
    console.log(this.someValue); 
    } 

} 

這一切給我一個錯誤: 未捕獲錯誤:無法解析SampleComponent的所有參數:(?)。

在同一時間,如果我嘗試使用字符串作爲標記,在模塊中聲明,一切正常。另外,如果我直接在組件文件中聲明瞭InjectionToken,然後直接在組件裝飾器中設置'providers',那麼所有東西都可以再次運行。

所以問題是:爲什麼在模塊文件中聲明的InjectionToken不可用於注入組件。

+8

移動'export let SOME_TOKEN = new InjectionToken ('someToken');'分隔文件。你有循環依賴 – yurzui

+0

@yurzui謝謝! –

回答

3

根據@yurzui,有一個循環依賴。 將令牌移動到單獨的文件有幫助。

+3

與其回答您的問題,您應該要求yurzui提供評論作爲答案,以便您可以接受。它會更有禮貌,因爲你會感激。 – echonax