2016-01-21 291 views
8

我有一個typecript類代表模型,我希望實例通過angular的Http服務與API通信。當構造函數有參數時Angular 2中的依賴注入

但是模型的構造函數在創建實例時需要參數。例如一些超級簡單:

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

我想注入Http服務,所以它是提供給我的例子,但它似乎是規範的方式做到這一點與commandeers構造:

constructor(http:Http) 

我一直在挖掘Injector文檔,但它有點稀疏,我還沒有找到任何有效的工具。有沒有辦法在不使用構造函數模式的情況下從DI系統獲得對像Http這樣的服務的引用?

+0

也許你可以使用'provide',就像當[測試HTTP](http://pastebin.com/UAJ3XeRf),但它是醜陋的(,我會保持乾淨的模型,並留下取到的組件/服務... – Sasxa

+0

謝謝,我明白@Sasxa。應用程序是一堆不同類型的節點,通過API保存到圖形數據庫中。每種節點都有一個稍微不同的要求,並且它很適合將其作爲抽象節點類的子類進行建模。爲了節省,我只能說'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或Angular 2中的控制器本身。您不需要爲該模型創建一個類並將邏輯放入其中。

在一個控制器構造函數中,您可以通過依賴注入來傳遞多個服務,只需在構造函數中提及它們即可,它需要儘可能多的參數。

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

} 
+1

這個答案有點令人困惑 - $ scope在Angular2中起作用了嗎? –

+0

對不起,我習慣以$ scope的角度考慮角度。在2.0中沒有$ scope。 – Jim

2

更新

HTTP_PROVIDERS早已不復存在。 HttpClientModule是目前的替代品。

如果注入有構造函數傳遞參數@Injectable註釋需要添加一個類。

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

對於這個工作HTTP_PROVIDERS需要被添加到bootstrap(AppComponent, [HTTP_PROVIDERS]);

參見Angular2 beta - bootstrapping HTTP_PROVIDERS - "Unexpected Token <"

如果你需要從你的組件通過其他參數,youcoud使用功能,而不是將它們傳遞。

另一種方法是手動創建實例並從注入器請求Http

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

    } 
} 
+0

謝謝@Günter,我認爲蘭利找到了我的答案。我試圖將我自己的參數傳遞給我的構造函數,同時仍然可以訪問SomeModel實例中的Http服務。 –

+0

啊,沒有看完所有的評論,只看到沒有正確的答案。 –

+0

爲什麼不簡單地使用工廠('useFactory'而不是'useClass')來注入依賴關係。 好處是您可以放棄所有註釋。 – Mik378

4

我設法解決了使用角度4的相同問題。首先創建使用分量注入器的新注入器。它知道你的SomeModel類,並通過modelParams作爲SomeModelParameters類的實例。然後你使用這個新創建的注入器來創建類實例。

@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]); 
    } 
} 
相關問題