2016-09-08 82 views
0

我已經閱讀了互聯網上關於不透明令牌的所有內容,並不認爲我可以通過本書更多地完成這項工作。Angular 2 OpaqueToken結果爲空(RC6)

功能我想:

我有一個常量對象。我希望該對象在整個應用程序範圍內可注射。

export const Constants = {...key/vals...} 

很簡單。 我創建一個OpaqueToken讓我做這個常量對象注射:

import {OpaqueToken} from '@angular/core'; 
export const AppConstants = new OpaqueToken('AppConstants'); 

也很簡單。

以我根模塊定義,我同時導入OpaqueToken和我的常量對象,並使用地圖字面其放置在供應商陣列:

import {Constants} from '....'; 
import {AppConstants} from '....'; 

@NgModule({ 
    ... 
    providers: [ 
     {provide: AppConstants, useValue: Constants} 
    ], 
    ... 
}) 

好真棒。現在,在我的任何導入模塊,如果我理解整個「服務是全球可用」的事情,我應該能夠做到以下幾點:

import {AppConstants} from '.....'; 

@Injectable() 
export class MyCoolClass { 
    constructor(@Inject(AppConstants) private constants:any) { 
    } 

    someMethod(){ 
     let myVar = this.constants['someValue']; 
    } 
} 

編譯沒有問題(我使用的WebPack) 。然而,在運行時,我得到:

EXCEPTION: Error in ./App class App_Host - inline template:0:0 caused by: Cannot read property 'someValue' of null 

顯然,這已被簡化,所以你可以閱讀更容易,但我真的只是轉換變量名。

我在這裏不瞭解DI嗎?我認爲OpaqueToken應該是解決將固定值注入構造函數的問題,我認爲@Inject是實現它的方式。

有沒有人有任何想法爲什麼我null返回我的常量對象的值?

感謝您的幫助!

+0

看起來沒問題,至少有關於OpaqueToken的部分。任何方式,沒有'null'的有效理由。是否沒有其他錯誤會阻止正常執行?你可以用SystemJS重新創建這個問題嗎?另請參閱[此檢查列表](http://stackoverflow.com/a/37166080/3731501)。 – estus

+0

好的,所以,這是我一直在使用的問題(webpack?Angular?) - 每桶進口不「始終」工作。我將我的導入語句更改爲明確的全路徑導入,並且工作正常。 這是我不時發現的情況(可能是30-50%的時間),在某些情況下桶的進口不起作用,沒有明顯的韻律或原因。 嗯......無論如何,固定。 – dudewad

回答

0

好的,所以,這是我一直在使用的問題(webpack?Angular?) - 桶的導入不能「始終」工作。我將我的導入語句更改爲明確的全路徑導入,並且工作正常。這是我不時發現的情況(大概是30-50%的時間),在某些情況下桶的進口不起作用,沒有明顯的韻律或原因。嗯.....

無論如何,固定。