2016-02-20 6 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 
    } 
} 

@マークが指摘したように、 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

ええ、私はストリングを渡すことが可能でなければならないようなもののように感じる。テンプレート内で初期化する必要はありません。 –