2016-05-05 98 views
3

我正在嘗試將自己創建的服務&的angular2 Http服務注入到我的自定義HttpRest服務中。將多個服務插入服務 - angular2

使用

@Inject(Http) public _http: Http 

工作得很好,但是當我嘗試注入另一個自制的服務,我得到以下錯誤:

EXCEPTION: Cannot resolve all parameters for 'HttpRest'(Http @Inject(Http), undefined @Inject(undefined)). Make sure that all the parameters are decorated with Inject or have valid type annotations and that 'HttpRest' is decorated with Injectable. 

出於某種原因 用戶ID是不確定的,即使導入成功的。 我的定製服務:

@Injectable() 
export class UserIds{ 
    private _signature_id:string; 
    private _role_id:number; 
    get signature_id():string{ 
     return this._signature_id; 
    } 
    set signature_id(id:string){ 
     this._signature_id = id; 
    } 
    get role_id():number{ 
     return this._role_id; 
    } 
    set role_id(id:number){ 
     this._role_id = id; 
    } 
} 

自定義HttpRest服務IM注射既使用HTTP &用戶ID爲:

@Injectable() 
export class HttpRest{ 
    groups; 
    constructor(
     @Inject(Http) public _http: Http, 
     @Inject(UserIds) public _ids: UserIds 
    ){} 
... 
} 

注意!當我刪除

, 
@Inject(UserIds) public _ids: UserIds 

我沒有得到錯誤。
我錯過了什麼?

UPDATE 這個問題實際上是用戶ID在構造函數中PARAMS的,即時通訊試圖瞭解一些未知的原因不確定,所以這個問題的標題變得無關緊要。它應該是「導入的服務在構造函數params中未定義」。
請在這個帖子後面再回答一下我對這個問題的回答。

更新:
請重新討論一個討論此問題的問題。 Using index.ts file to export class causes undefined in injected constructor

回答

0

您需要註冊在根級的UserIds服務(main.ts)或app.component.ts,這是在層次結構中的最高級別:

@Component({ 
    selector: 'my-app', 
    template: '<h1>My First Angular 2 App</h1>', 
    providers: [ UserIds ] 
}) 
export class AppComponent { } 
+0

我這樣做沒有結果。 @Component({ 選擇: 「... 」 templateUrl:「 ...」, 指令:[ ROUTER_DIRECTIVES ], 提供商: ROUTER_PROVIDERS, HttpRest, 用戶ID, 提供(LocationStrategy, {useClass:HashLocationStrategy}) ] }) – wagwanJahMan

1

@Inject(...)@Inject(Http) public _http: Http是多餘的當參數@Inject()與參數的類型相同。

@Injectable() 
export class HttpRest{ 
    groups; 
    constructor(public _http: Http, public _ids: UserIds 
    ){} 
... 
} 

您需要提供HttpUserIds所以DI是能夠解決的依賴。 Http包括在HTTP_PROVIDERS

@Component({ 
    selector: '...', 
    providers: [HTTP_PROVIDERS, UserIds], 
    template: ... 
}) 
export class AppComponent { 

} 

確保你擁有了一切正確的進口

import {HTTP_PROVIDERS, Http} from 'angular2/http'; 
+0

問題是,實際上,UserIds是未定義的構造函數參數中的一些未知的原因,即時通訊試圖瞭解,所以這個問題的標題變得無關緊要。它應該是「導入的服務在構造函數params中未定義」。 即使將成員中的導入類保存,我也可以看到它在構造函數執行上下文中分配。 – wagwanJahMan

+0

你有沒有在自己的文件中的每個類。如果您使用同一個文件中的類名稱,它將無法工作。班級沒有懸掛。否則,導入被破壞。否則,有一個允許重現的Plunker會很有幫助(模板https://plnkr.co/edit/KZu83k?p=info) –

+1

該類在其自己的文件中導出一個類。 然而,我會創建一個蹲點來展示問題,並將其作爲一個新問題發佈。然後我會更新這篇文章,並附上一個關於這個問題的鏈接。 現在我正在爲主要問題添加更新評論,因爲此問題的標題無關緊要。 – wagwanJahMan

1

行,所以我發現了這個問題,並且它不與進樣做。 問題在於即時消息使用索引文件導出服務,正如angular 2樣式指南(https://github.com/mgechev/angular2-style-guide/blob/master/old/README.md#directory-structure)中所述,並且由於某些原因,從索引導入此特定服務時會在注入構造函數時導致未定義的值。 當我直接聲明源而不是通過索引文件時,由於某些未知的原因,解決了錯誤。

修復之前進口看起來像這樣:

import {UserIds} from "../index"; 

與所有其他服務和組件的工作。

使用直接的源文件的導入:

import {UserIds} from "../user_ids/user_ids.service"; 

出於某種原因,這個解決我的問題,但我想留在index.ts封裝一致。

如果有人有一個想法,爲什麼會發生這種情況我會很高興爲更新。

+0

我剛碰到同樣的問題。感謝您的解決方案,但我也想知道是什麼問題..我不想直接引用我的課程,而是我正在建造桶...... – Spock