當 EnvironmentProviders 被用在只接受一般 provider 的上下文中(例如元件的 providers 陣列)時,就會發生這個錯誤。環境 provider 是為應用程式層級的設定而設計的,只能用在環境注入器中(例如在 bootstrapApplication 中設定的根注入器,或路由設定)。
常見情境
在元件的 providers 中使用 provideHttpClient()
像 provideHttpClient() 這類函式回傳的是 EnvironmentProviders,不能用在元件層級:
@Component({
providers: [
provideHttpClient(), // ERROR: EnvironmentProviders can't be used here
],
})
export class UserProfile {}
在元件的 providers 中使用 importProvidersFrom()
importProvidersFrom() 函式同樣回傳 EnvironmentProviders:
@Component({
providers: [
importProvidersFrom(SomeModule), // ERROR: can't be used for component providers
],
})
export class DataView {}
如何除錯
把環境 provider 移到適當的位置:
應用程式層級的 provider
在 bootstrapApplication 中設定環境 provider:
bootstrapApplication(App, {
providers: [provideHttpClient(), importProvidersFrom(SomeModule)],
});
路由專屬的 provider
在路由設定的 providers 陣列中使用:
const routes: Routes = [
{
path: 'admin',
component: AdminView,
providers: [provideHttpClient(withInterceptors([authInterceptor]))],
},
];
元件層級的服務
如果你需要元件範圍內的服務,請改用一般 provider,而不是環境 provider:
@Component({
providers: [
UserClient, // Regular provider - this works
{provide: API_URL, useValue: '/api'}, // Value provider - this works
],
})
export class UserProfile {}