2016-07-28 26 views
0

我正在創建服務,在不導入組件的情況下可以看到服務。Angular 2中的全局可見服務問題

我的自舉功能:

export function main(initialHmrState?: any): Promise<any> { 
    console.log(APP_PROVIDERS); 
    return bootstrap(App, [ 
    ...PLATFORM_PROVIDERS, 
    ...ENV_PROVIDERS, 
    ...APP_PROVIDERS 
    ]) 
    .then(decorateComponentRef) 
    .catch(err => console.error(err)); 
} 

應用提供商定義:

export * from './app.component'; 
export * from './user.state'; 
export * from './app.service'; 

import { UserState } from './user.state'; 
import { AppState } from './app.service'; 

// Application wide providers 
export const APP_PROVIDERS = [ 
    UserState, 
    AppState 
]; 

,我不能把它的部件構造

constructor(private userState: UserState) {} 

我怎樣才能解決我的問題?

回答

1

通過導入,或使用字符串令牌或OpaqueToken和'@Inject()

export const APP_PROVIDERS = [ 
    {provide: 'UserState', useClass: UserState}, 
    AppState 
]; 
constructor(@Inject('UserState') private userState: any) {} 
+0

我在控制檯時有錯誤我在組件中使用它: /home/maksym/untill/trunk/unTill.Modern/Code/App/src/app/backoffice/backoffice.component.ts:13:53 找不到名稱'UserState'。 –

+0

對不起,我在錯誤的地方用'any'取代了'UserState'。我更新了我的答案。你仍然需要在你提供它的地方輸入'UserState'。 –

1

有兩個部分:

  • 使用定義提供程序名稱類型
  • 使用注射類型

在這兩種情況下,都需要導入相應的類型。否則,它們將不會被解決...

請注意,使用類型進行依賴注入並不是強制性的。您最終可以使用OpaqueToken S:

export const SOME_TOKEN = new OpaqueToken('sometoken'); 
let provider = { provide: token, useClass: UserState }; 

,並使用它:

constructor(@Inject(SOME_TOKEN) private userState: UserState) {} 

但在這種情況下,您還需要導入不透明令牌......