У меня есть проект, который я перенес на Angular 18 с настройкой для использования HttpClient
путем импорта HttpClientModule
.
@NgModule({
imports: [
BrowserModule,
HttpClientModule,
...
],
declarations: [
AppComponent,
...
],
bootstrap: [ AppComponent ]
})
export class AppModule {}
В версии 17 HttpClientModule
все было хорошо, но теперь она помечена как устаревшая.
Почему он устарел и чем он может заменить?
HttpClientModule
был заменен уже существующей функцией поставщика provideHttpClient()
.
@NgModule({
imports: [
BrowserModule,
// Remove the module
...
],
declarations: [
AppComponent,
...
],
providers: [provideHttpClient()] // add it here
bootstrap: [ AppComponent ]
})
export class AppModule {}
Если вы видите следующую ошибку: Type 'EnvironmentProviders' is not assignable to type 'Provider'.
, это означает, что вы импортировали HttpClientModule
в компонент. Этого не должно было произойти в первую очередь. Просто удалите импорт.
Если вы используете автономный компонент, provideHttpClient()
необходимо добавить к поставщикам при вызове bootstrapApplicati()
:
boostrapApplication(AppComponent, {providers: [provideHttpClient()]});
Причина этого изменения заключается в том, что HttpClientModule
удвоил функцию provideHttpClient()
, которая была введена для автономных приложений.
А вот выдержка из исходного кода Angular, модуль на самом деле просто предоставлял HttpClient. (Никаких деклараций, импорта или экспорта)
@NgModule({
providers: [provideHttpClient(withInterceptorsFromDi())],
})
export class HttpClientModule {}
Поэтому команда решила объявить его устаревшим, и в сообщении об устаревании предлагается использовать функцию поставщика provideHttpClient()
. Таким образом, разработчики будут менее склонны объявлять и модуль, и поставщика. Это была обычная проблема среди новых разработчиков.
Вы не должны иметь его в компоненте.
Что делать, если нет AppModule, а есть отдельный AppComponent и служба, которая внедряет HttpClient? Где предоставить новую форму устаревшего HttpClientModule? Если я ничего не предоставлю, я получу сообщение «NullInjectorError: NullInjectorError: Нет поставщика для _HttpClient!» и вы говорите, что метод ProvideHttpClient() не должен использоваться в компоненте приложения (что приводит к тому, что «Тип «EnvironmentProviders» не может быть назначен типу «Поставщик»).
@Simon добавляй его в список провайдеров при звонке boostrapApplication
Добавьте это в файл app.config.ts и не добавляйте импорт HttpClient или HttpClientModule в app.comComponent.ts.
Чтобы использовать ProvideHttpClient(), его необходимо импортировать из @angular/common/http.
Вы также можете добавить файл app.config.ts.
export const appConfig: ApplicationConfig = {
providers: [
. . .
provideHttpClient(withFetch())
]
};
Вам нужно добавить provideHttpClient()
к app.config.ts
:
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительную информацию, которая поможет другим понять, как это относится к заданному вопросу. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
У меня не работает. Я получаю: TS2322: Тип «EnvironmentProviders» нельзя назначить типу «Поставщик».