錯誤百科

EnvironmentProviders 用在錯誤的上下文

當 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 {}