Кутове ВИКОНАННЯ: Немає постачальника Http


333

Я отримую EXCEPTION: No provider for Http!в моїй програмі Angular. Що я роблю неправильно?

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.
Ерік Мартінес

1
імпорт / експорт ... будь-хто, який це синтаксис?
vp_arth

5
Це синтаксис машинопису
Даніель

10
імпорт / експорт - це синтаксис JavaScript (ES6)
alexpods

3
Було б добре, якби одна з відповідей фактично пояснила, чому нам потрібно імпортувати HttpModule, і що це робить.
Дражен Беловук

Відповіді:


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
У проектах, що генеруються з кутовими кліпами, файл викликається main.ts.
філоксо

що робити, якщо у мене немає NgModule? Я розробляю модуль angular2, і він не має NgModule, але для тестів мені потрібен Http-провайдер
iRaS

@Webruster Я щойно перевірив. Це все одно має працювати. Чи можете ви дати мені точний код помилки?
Філіп

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

Кутова2> = 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

З випуском Angular 2.0.0 випуску 14 вересня 2016 року ви все ще використовуєте 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ви можете завантажитися як таке:

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: []
})

Хто так не позначив це неправильно, чи можу я знати, що є причиною?
Шиванг Гупта

5
Я не подав заявки, але причина, ймовірно, у тому, що ви не хочете нового Httpоб'єкта для кожного компонента. Краще мати єдиний для програми, який здійснюється шляхом імпорту на NgModuleрівні.
Тед Хопп

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
**

Проста душа: імпортуйте 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.
Собван

1

Все, що вам потрібно зробити, це включити наступні бібліотеки в tour app.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
Будь ласка, не повторюйте існуючі відповіді. Це не приносить користі громаді.
Ізервуд

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.