ข้อยกเว้นเชิงมุม: ไม่มีตัวให้บริการสำหรับ Http


333

ฉันได้รับEXCEPTION: No provider for Http!แอพเชิงมุมของฉัน ผมทำอะไรผิดหรือเปล่า?

import {Http, Headers} from 'angular2/http';
import {Injectable} from 'angular2/core'


@Component({
    selector: 'greetings-ac-app2',
    providers: [],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})
export class GreetingsAcApp2 {
    private str:any;

    constructor(http: Http) {

        this.str = {str:'test'};

        http.post('http://localhost:18937/account/registeruiduser/',
            JSON.stringify(this.str),
            {
                headers: new Headers({
                    'Content-Type': 'application/json'
                })
            });

3
HTTP_PROVIDERSคุณจะหายไป
Eric Martinez

1
นำเข้า / ส่งออก ... ได้โปรดใครไวยากรณ์นี้คืออะไร
vp_arth

5
มันคือไวยากรณ์ของ typescript
แดเนียล

10
นำเข้า / ส่งออก - เป็นไวยากรณ์ JavaScript (ES6)
alexpods

3
มันจะดีถ้าคำตอบอย่างใดอย่างหนึ่งอธิบายว่าทำไมเราต้องนำเข้าHttpModuleและสิ่งที่มันทำ
Drazen Bjelovuk

คำตอบ:


520

นำเข้า HttpModule

import { HttpModule } from '@angular/http';

@NgModule({
    imports: [ BrowserModule, HttpModule ],
    providers: [],
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})
export default class AppModule { }

platformBrowserDynamic().bootstrapModule(AppModule);

เป็นการดีที่คุณแบ่งรหัสนี้เป็นสองไฟล์แยกกัน สำหรับข้อมูลเพิ่มเติมอ่าน:


2
ในปัจจุบัน Angular2 app.tsเบต้าไฟล์จะถูกเรียกว่า
d135-1r43

7
ในโครงการสร้างมุม-CLI main.tsไฟล์จะถูกเรียกว่า
filoxo

ถ้าฉันไม่มี NgModule ล่ะ ฉันกำลังพัฒนาโมดูล angular2 และมันไม่มี NgModule แต่สำหรับการทดสอบฉันต้องการผู้ให้บริการ Http
iRaS

@Webuster ฉันเพิ่งตรวจสอบ มันควรจะยังคงทำงาน คุณสามารถให้รหัสข้อผิดพลาดที่แน่นอนกับฉันได้ไหม
ฟิลิป

2
@PhilipMiglinci ... ขอบคุณสำหรับคำตอบที่มีค่า .. เพิ่มบางจุดสำหรับผู้ค้นหาว่าไฟล์นั้นจะเป็นapp.module.tsในเชิงมุม 2.0 สำหรับคำอธิบายนี่เป็นไฟล์หลักสำหรับโครงการที่จะรวมโมดูลซึ่งจะใช้การสืบทอดต่อไป ชั้นเรียน
shaan gola

56

> = เชิงมุม 4.3

สำหรับการแนะนำ HttpClientModule

import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule, // if used
    HttpClientModule,
    JsonpModule // if used
  ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Angular2> = RC.5

นำเข้าHttpModuleสู่โมดูลที่คุณใช้ (ตัวอย่างเช่นAppModule:

import { HttpModule } from '@angular/http';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule, // if used
    HttpModule,
    JsonpModule // if used
  ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

การนำเข้าHttpModuleค่อนข้างคล้ายกับการเพิ่มHTTP_PROVIDERSในรุ่นก่อนหน้า


9

ด้วยการเปิดตัว 14 กันยายน 2016 Angular 2.0.0 คุณยังคงใช้งาน HttpModule อยู่ หลักของคุณapp.module.tsจะมีลักษณะเช่นนี้:

import { HttpModule } from '@angular/http';

@NgModule({
   bootstrap: [ AppComponent ],
   declarations: [ AppComponent ],
   imports: [
      BrowserModule,
      HttpModule,
      // ...more modules...
   ],
   providers: [
      // ...providers...
   ]
})
export class AppModule {}

จากนั้นในของapp.tsคุณคุณสามารถ bootstrap เช่นนี้:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/main/app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

9

เพิ่ม HttpModule เพื่อนำเข้าอาร์เรย์ในไฟล์app.module.tsก่อนที่คุณจะใช้

import { HttpModule } from '@angular/http';

@NgModule({
  declarations: [
    AppComponent,
    CarsComponent
  ],
  imports: [
    BrowserModule,
	HttpModule  
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }


9

ตั้งแต่rc.5คุณต้องทำอะไรบางอย่างเช่น

@NgModule({
    imports: [ BrowserModule],
    providers: [ HTTP_PROVIDERS ],  
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})
export default class AppModule { }

platformBrowserDynamic().bootstrapModule(AppModule);


5

นำเข้าHttpModuleในไฟล์ app.module.ts ของคุณ

import { HttpModule } from '@angular/http';
import { YourHttpTestService } from '../services/httpTestService';

นอกจากนี้อย่าลืมประกาศ HttpModule ภายใต้การนำเข้าดังนี้:

imports: [
    BrowserModule,
    HttpModule
  ],

4

วิธีที่ดีที่สุดคือเปลี่ยนเครื่องมือตกแต่งภายในส่วนประกอบของคุณโดยเพิ่ม Http ในอาร์เรย์ผู้ให้บริการดังนี้

@Component({
    selector: 'greetings-ac-app2',
    providers: [Http],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})

ใครก็ตามที่ทำเครื่องหมายว่าผิดฉันขอทราบเหตุผลได้ไหม
Shivang Gupta

5
ฉันไม่ได้ลงคะแนน แต่เหตุผลอาจเป็นเพราะคุณไม่ต้องการHttpวัตถุใหม่สำหรับแต่ละองค์ประกอบ ดีกว่าที่จะมีหนึ่งเดียวสำหรับแอปซึ่งสามารถทำได้โดยการนำเข้าในNgModuleระดับ
Ted Hopp

3

ตั้งแต่ RC5 คุณต้องนำเข้า HttpModule ดังนี้:

import { HttpModule } from '@angular/http';

จากนั้นรวม HttpModule ในอาร์เรย์การนำเข้าตามที่กล่าวไว้ข้างต้นโดยGünter


3

เพียงรวมไลบรารีดังต่อไปนี้:

import { HttpModule } from '@angular/http';
import { YourHttpTestService } from '../services/httpTestService';

และรวมคลาส http ไว้ในprovidersส่วนดังต่อไปนี้:

@Component({
  selector: '...',
  templateUrl: './test.html',
  providers: [YourHttpTestService]

3

หากคุณมีข้อผิดพลาดในการทดสอบคุณควรสร้างบริการปลอมสำหรับบริการทั้งหมด:

ตัวอย่างเช่น:

import { YourService1 } from '@services/your1.service';
import { YourService2 } from '@services/your2.service';

class FakeYour1Service {
 public getSomeData():any { return null; }
}

class FakeYour2Service {
  public getSomeData():any { return null; }
}

และก่อนอื่นแต่ละ:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    providers: [
      Your1Service,
      Your2Service,
      { provide: Your1Service, useClass: FakeYour1Service },
      { provide: Your2Service, useClass: FakeYour2Service }
    ]
  }).compileComponents();  // compile template and css
}));

3
**

Simple soultion: นำเข้า HttpModule และ HttpClientModule บนapp.module.tsของคุณ

**

import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';



@NgModule({
 declarations: [
   AppComponent, videoComponent, tagDirective, 
 ],
 imports: [
  BrowserModule, routing, HttpClientModule, HttpModule

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

วิธีนี้ใช้ได้ผล แต่ HttpModule ถูกทำเครื่องหมายว่าเลิกใช้แล้วใน Angular 5.2 ฉันคิดว่าองค์ประกอบบางอย่างไม่ได้รับการอัพเกรดและยังคงใช้การใช้ Http แบบเก่า
Sobvan

1

สิ่งที่คุณต้องทำคือการรวมไลบรารี่ต่อไปนี้ในทัวร์แอป. module.tsและรวมไว้ในอิมปอร์ตของคุณ:

import { HttpModule } from '@angular/http';

@NgModule({
  imports:    [ HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

1

ฉันประสบปัญหานี้ในรหัสของฉัน ฉันใส่รหัสนี้ใน app.module.ts เท่านั้น

import { HttpModule } from '@angular/http';

@NgModule({
  imports:      [ BrowserModule, HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

1
โปรดอย่าทำซ้ำคำตอบที่มีอยู่ การทำเช่นนั้นจะไม่เพิ่มคุณค่าให้กับชุมชน
isherwood

1

import { HttpModule } from '@angular/http'; แพคเกจในไฟล์ module.ts ของคุณและเพิ่มในการนำเข้าของคุณ


1

ฉันเพิ่งเพิ่มสิ่งเหล่านี้ใน app.module.ts ของฉัน:

"import { HttpClientModule }    from '@angular/common/http'; 

&

import { HttpModule } from '@angular/http';"

ตอนนี้มันใช้งานได้ดี .... และอย่าลืมเพิ่มใน

@NgModule => Imports:[] array

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.