2016-01-21 6 views
8

私はモデルを表すtypescriptクラスを持っており、インスタンスは角度のHttpサービスを介してAPIと通信することを望みます。コンストラクタに引数がある場合の角度2の依存性注入

しかし、インスタンスを作成するときには、モデルのコンストラクタに引数が必要です。超簡単な例を何かのために:

class SomeModel{ 
    constructor(public id:number, public name:string,){ 
    } 

私はそれが私のインスタンスに利用できるようHttpサービスを注入したいと思いますが、それはこれを行うための標準的な方法のように思えるとコンストラクタをcommandeers:

constructor(http:Http) 

私はInjectorのドキュメントを掘り下げてきましたが、それは少し疎で、うまく動作するものは見つかりませんでした。コンストラクタパターンを使用せずにDIシステムからHttpのようなサービスへの参照を取得する方法はありますか?

+0

たぶん、あなたは[テストのHttp](http://pastebin.com/UAJ3XeRf)のように、 'provide'を使用することができますが、それは(醜いです;私は/コンポーネントにフェッチきれいなモデルを維持したままだろうサービス... – Sasxa

+0

ありがとう、私は@ Sasxaに感謝します。アプリケーションは、APIを介してグラフDBに保存されるノードの種類の束です。それぞれの種類のノードは若干異なる要件を持ち、抽象的なノードクラスのサブクラスとしてモデル化するとうまくいきます。節約するためには、サービス内にどのような種類のノードであるのか、それをどのように保存/取得するのか、それをどのように関係づけるのかを判断するのではなく、 'nodeInstance.save()'というだけでいいです。それは間違ったアプローチかもしれませんが、Httpリファレンスを入手するためのより良い方法を見つけることができれば、私には持続可能なようです。 –

+0

私は、特に[http](https://angular.io/docs/ts/latest/api/http/Http-class.html)と[xhrbackend](https://angular.io /docs/ts/latest/api/http/XHRBackend-class.html)、多分[this](http://pastebin.com/bQcJALjA)はあなたのために働くでしょう... – Sasxa

答えて

-5

まず、angularJSのモデルは、$ scopeまたは角2、コントローラ自体を参照します。モデルのクラスを作成してロジックを入れる必要はありません。

コントローラーコンストラクターでは、コンストラクターで複数のサービスを渡すことができます。これは、必要なだけ多くのパラメーターを取ります。

constructor($scope:any, yourService:SomeService yourOtherService:OtherService) 
{ 

} 
+1

この回答はちょっと混乱します - $ scopeはAngular2でどのように機能しますか? –

+0

申し訳ありませんが、私は$ scopeの角度について考えるのに慣れています。 2.0には$スコープはありません。 – Jim

2

更新

HTTP_PROVIDERSはとっくにいなくなっています。 HttpClientModuleが現在の置き換えです。

あなたは@Injectable注釈を追加する必要があるコンストラクタのパラメータを持つクラスを注入した場合。 bootstrap(AppComponent, [HTTP_PROVIDERS]);

を参照してくださいに追加するHTTP_PROVIDERSニーズを動かすためには

@Injectable() 
class SomeModel{ 
    // constructor(public id:number, public name:string,){ 
    // } 
    constructor(http:Http) {} 
} 

Angular2 beta - bootstrapping HTTP_PROVIDERS - "Unexpected Token <"

あなたのコンポーネントから他の引数を渡す必要がある場合は、代わりに関数を使用してそれらを渡すyoucoud。

もう1つの方法は、インスタンスを手動で作成し、インジェクタからHttpを要求することです。

export class MyComponent { 
    constructor(injector: Injector) { 
    this.someModel = new SomeModel(Injector.resolveAndCreate(Http), 1, 2); 

    } 
} 
+0

Thanks @Günter、私はLangleyが私の答えを見つけたと思う。 SomeModelインスタンス内のHttpサービスにアクセスしながら、独自の引数をコンストラクタに渡そうとしています。 –

+0

ああ、すべてのコメントを読んでいない、ただ正しい答えが見えませんでした。 –

+0

単純に、依存関係を注入するために単に(useClass'の代わりに 'useFactory')を使うのではないでしょうか。 すべてのアノテーションを削除できるという利点があります。 – Mik378

4

私は角度4を使用して同じ問題を解決することができました。まず、コンポーネントインジェクタを使用する新しいインジェクタを作成します。あなたのSomeModelクラスについて知っていて、クラスのインスタンスとしてmodelParamsを渡します。次に、この新しく作成したインジェクタを使用してクラスインスタンスを作成します。

@Injectable() 
class SomeModel { 
    constructor(http: Http, someModelParamters: SomeModelParameters) { } 
} 

export class MyComponent { 
    constructor(injector: Injector) { 
     const modelParams = new SomeModelParameters(); 
     const injectorWithModelParams = ReflectiveInjector.resolveAndCreate(
      [ 
       SomeModel, 
       { provide: SomeModelParameters, useValue: modelParams } 
      ], 
      injector); 
     this.someModel = injectorWithModelParams.resolveAndInstantiate([SomeModel]); 
    } 
}