2017-09-02 46 views
0

我已經在TypeScript中創建了一個組件庫,我想分享許多服務。如何將公共依賴注入到其他Angular2 @Injectable類中?

export abstract class ComponentBase<T> { 
    constructor(protected http:Http, protected router: Router, protected route: ActivatedRoute, protected params: Params) { 
    } 
} 

問題是我有多個嵌套類型,所以每當我必須從層次結構中派生任何級別。每個派生類型看起來都像這樣傳遞了基礎的注入參數。

import { Http } from '@angular/http'; 
import { Router, ActivatedRoute, Params } from '@angular/router'; 
export class SomeDerivedType extends ComponentBase<SomeType> { 
    constructor(protected http: Http, protected router: Router, protected route: ActivatedRoute, protected params: Params) { 
    super(http, router, route, params); 
    } 
} 

我必須鏈我的構造函數來滿足基類的構造函數參數。這是非常煩人的開銷。因此,我創建了一個Services類來保存所有封裝的依賴項。

import { Injectable } from '@angular/core'; 
import { Router, ActivatedRoute, Params } from '@angular/router'; 
import { Http } from "@angular/http"; 

@Injectable() 
export class Services { 
    constructor(public http:Http, public router: Router, public route: ActivatedRoute, public params: Params) { 
    } 
} 

我認爲我應該能夠將這個服務類注入組件如下。

import { Services } from './services' 
export class SomeDerivedType extends ComponentBase<any> { 
    constructor(protected services: Services) { 
    super(services); 
    } 
} 

而且現在的分量基礎如下所示:

import { Services } from './services'; 
import { Http } from '@angular/http'; 
import { Router, ActivatedRoute, Params } from '@angular/router'; 

export abstract class ComponentBase<T> { 
    http: Http; 
    router: Router; 
    route: ActivatedRoute; 
    params: Params; 
    constructor(protected services: Services) { 
    this.http = services.http; 
    this.route = services.route; 
    this.router = services.router; 
    this.params = services.params; 
    } 
} 

這不幸地不是爲我工作,而不是我得到以下錯誤:

(index):63 Error: Error: Can't resolve all parameters for Services: ([object Object], [object Object], [object Object], ?).

因此,很自然我問題是,「是否有辦法將依賴服務(即http,路由器,路由和參數服務)注入到我的服務類中?」

+0

如果組件庫和任何派生類需要注入依賴關係,那麼它們需要使用注入式裝飾器(或指令或組件)進行修飾,但是不應該這樣構造應用程序。用您創建的所有隱藏的依賴關係來維護幾乎是不可能的。 – bryan60

+0

我不知道我要維護什麼,你可以詳細說明一下嗎?此外,我不注入除服務類以外的任何東西,所以爲什麼我需要用@injectable裝飾組件類? – jwize

+0

這樣做的任何優勢? – Aravind

回答

1

那麼,事實證明,我錯過了一些關於角度的東西,這對我來說並不清楚。我只用了一小會兒。問題其實很簡單。 Params不是服務。

(index):63錯誤:錯誤:無法解析服務的所有參數:([對象對象],[對象對象],[對象對象],?)。

該消息讓我失望,因爲它說不能解決所有問題。我誤解了它,因爲它確實告訴我其中一個參數沒有得到解決。在我的情況下,受保護的參數:Params。

這段代碼現在可以很好地工作,就像我希望通過刪除params項目一樣。