Angular 17 Http 客户端注入

回答 4 浏览 4161 2023-11-14

我正在构建一个新的应用程序,用于使用 Angular 17 进行测试,尝试连接到简单的 API Rest。我迫切希望它能正常工作。我询问过聊天 GPT,查看了 stack 的旧帖子,甚至下载了旧的应用程序,但没有成功。

这是我的应用程序配置和错误:

app.module.ts

import {FormsModule, ReactiveFormsModule} from '@angular/forms';
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import {AppComponent} from "./app.component";
import {HttpClientModule} from "@angular/common/http";
import {ClienteService} from "./cliente.service";
import {ClienteComponent} from "./cliente/cliente.component";
import {AppRoutingModule} from "./app-routing.module";



@NgModule({
  declarations: [
    AppComponent,
    ClienteComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    HttpClientModule,
    AppRoutingModule

  ],
  providers: [ClienteService],
  bootstrap: [AppComponent]
})
export class AppModule { }

app-routing.module.ts


import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';

import {ClienteComponent} from "./cliente/cliente.component";

const appRoutes: Routes = [
  { path: '', redirectTo: '/clientes', pathMatch: 'full' },
  { path: 'clientes', component: ClienteComponent}
];

@NgModule({
  imports: [RouterModule.forRoot(appRoutes)],
  exports: [RouterModule]
})
export class AppRoutingModule {

}

cliente.service.ts

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class ClienteService {

  private clienteUrl: string;

  constructor(private http: HttpClient) {
    this.clienteUrl = 'http://localhost:8081/clientes';
  }
  getClientes(nombre?: string, telefono?: string, direccion?: string) {
    const params: any = { nombre, telefono, direccion };
    return this.http.get(this.clienteUrl, { params });
  }

cliente.component.ts

import {Component, OnInit} from '@angular/core';
import { CommonModule } from '@angular/common';
import {ClienteService} from "../cliente.service";

@Component({
  selector: 'app-cliente',
  standalone: true,
  imports: [CommonModule],
  templateUrl: './cliente.component.html',
  styleUrl: './cliente.component.css'
})
export class ClienteComponent implements OnInit{

  clientes: any[] = [];

  constructor(private clienteService: ClienteService) {

  }

  ngOnInit(): void {
    this.clienteService.getClientes().subscribe((clientesResponse:any) => {
      console.log('Respuesta del servicio getAllClientes',clientesResponse);
      this.clientes=clientesResponse._embedded.clientes;


    });
  }

}

问题是这样的:

ERROR NullInjectorError: R3InjectorError(Standalone[_AppComponent])[_ClienteService -> _ClienteService -> _HttpClient -> _HttpClient]: 
  NullInjectorError: No provider for _HttpClient!
    at NullInjector.get (core.mjs:5601:27)
    at R3Injector.get (core.mjs:6044:33)
    at R3Injector.get (core.mjs:6044:33)
    at injectInjectorOnly (core.mjs:911:40)
    at Module.ɵɵinject (core.mjs:917:42)
    at Object.ClienteService_Factory [as factory] (cliente.service.ts:7:28)
    at core.mjs:6164:43
    at runInInjectorProfilerContext (core.mjs:867:9)
    at R3Injector.hydrate (core.mjs:6163:17)
    at R3Injector.get (core.mjs:6033:33)
handleError @ core.mjs:11747
Rachel 提问于2023-11-14
我认为您不希望在 app.module 中使用此内容:providers:[ClienteService]pcalkins 2023-11-14
@Rachel,如果您使用“独立”组件 - 您的 ClientComponent 是 - 您可以在像这样的提供程序中注入 Http SO。此外,您还需要将服务添加为提供商。当您使用模块时,我建议避免使用独立组件。注意:确实是“搜索实验室”,它非常差Eliseo 2023-11-15
4 个回答
#1楼 已采纳
得票数 10

您正在混合模块和独立组件。从 Angular 17 开始,默认情况下一切都是独立的,除非您另外指定。

你有两个选择。

  1. 不要使用独立的组件,使组件成为模块的一部分,然后模块中的导入数组应该可以工作。
  2. 无需模块即可工作,使应用程序完全独立。正如 Angular 17 的预期

如果您在 Angular 17 中启动了一个项目,我建议不要使用第一个选项。

首先,转到main.js并将provideHttpClient(withFetch())添加到providers数组中。而不是在 AppModule 中导入 HttpClientModule。

bootstrapApplication(AppComponent, {
  providers: [
    provideHttpClient(withFetch()),
  ],
});
vbartalis 提问于2023-11-15
vbartalis 修改于2023-11-28
#2楼
得票数 5

无论如何,将 provideHttpClient() 添加到默认的 appConfig 提供程序列表为我解决了同样的问题。

所以默认的 src/app/app.config.ts 看起来像这样。

import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';

import { routes } from './app.routes';
import { provideHttpClient } from '@angular/common/http';

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(routes),
    provideHttpClient()
  ]
};

尽管我不知道它的工作原理,但 @vbartalis 的回复在我看来是有道理的。

Murrelken 提问于2023-11-15
独立组件记录在此处,包括 bootstrapApplication 的示例:angular.io/guide/standalone-componentsFlorian 2023-11-17
#3楼
得票数 0

在 appcomponent.ts 中,将 HttpClientModule 添加到 styleUrls 数组后面的导入数组中。这个对我有用

Abrar 提问于2023-11-22
#4楼
得票数 0

使用独立组件允许您像模块一样使用组件,因此将您的服务放在“providers: [service]”内的“@component{”内。与模块中的方式完全相同

例子:

@Component({
  selector: 'app-cliente',
  standalone: true,
->imports: [CommonModule, HttpClientModule],
->providers: [ClienteService],
  templateUrl: './cliente.component.html',
  styleUrl: './cliente.component.css'
})
Bagestan 提问于2023-11-23
Bagestan 修改于2023-11-23