2016-04-06 14 views
10

コンストラクタにはオプションのパラメータがあり、DIを実行する際の主な方法を混乱させるようです。角度2のDIコンストラクタ(任意のパラメータ付き)

constructor(public name:string, public age?:number, private _service:Service); 

活字体は、当然のことながら、私はオプションのパラメータが設定されていない場合、さらにサービスが注入されない、オプションの1の後ろに非オプションのパラメータを置くことを好きではありません。それをどうすれば解決できますか?私は手動でサービスを設定することが予想されるため、コンストラクタのどこかに置くことはできません。

フィールド注入はありますか?

@Inject() private _service:Service; 

constructor(public name:string, public age?:number); 

省略可能なパラメータをデフォルト値に置き換える必要がありますか?その他の提案はありますか?

おかげ

編集 以下に説明するように、私は、角度のDIによって作成されていないオブジェクトにサービスを注入することを試みました。これは機能しません。 DIを使用してこのクラス(モデル)を作成することはできないので、このオブジェクトをインスタンス化するクラスから手動でサービスを渡します。

答えて

12

プロバイダが登録されている場合にのみ注入するコンストラクタパラメータの前に、@Optional()デコレータを追加してください。

constructor(public name:string, @Optional() public age:number) 
+0

を、しかし:https://angular.io/docs/ts/latest/guide/dependency-injection.html#factory-provider

基本的には、

class MyClass { constructor(public name:string, private _service:Service, public age?:number){} } 

そして

let myFactory = (_service: Service) => { return isAgeOk ? new MyClass(name, _service, age) : new MyClass(name, _service); }; 

そして、あなたはこのようなあなたのサービスを提供する必要があります。ここを参照してください。年齢 "は私が注射したいものではありません。私は 'new Person(" Mike "、32)のようなコンストラクタを使って新しいオブジェクトを作成し、' Service'は年齢の設定から独立して注入されるべきです。または、@Optional()を使用して任意のオプション(TS =?)に注釈を付けるだけでよいですか? – KenavR

+2

私はあなたの質問を完全に理解しているかわかりません。 'new Person(" Mike "、32)では、依存関係の注入はまったくありません。 DIは、DI自体によってインスタンスが作成された場合にのみ関係します。たとえば、コンポーネントとその依存関係はDIによってインスタンス化されます。あなたは明確にしていただけますか? –

+0

"DIはインスタンスがDI自身によって作成された場合にのみ関係します。"私はそれが私の "問題"か、私が理解できなかったことだと思います。私は、コンストラクタを使って名前と年齢を手動で設定するオブジェクトを作成します。 DIは登録されたプロバイダに他のパラメータを注入すると思っていました。それは動作しないと思う。 – KenavR

1

あなたがしようとしていることを正しく理解している場合は、サービスファクトリが必要です。 「私は何かが欠けすることができる

providers: [{ provide: MyClass, useFactory: MyFactory, deps: [Service]}] 
関連する問題