ECCEZIONE angolare: nessun provider per http


333

Ricevo l' EXCEPTION: No provider for Http!app nella mia app Angular. Che cosa sto facendo di sbagliato?

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
Ti stai perdendo HTTP_PROVIDERS.
Eric Martinez,

1
import / export ... per favore, qualcuno, che sintassi è questa?
vp_arth,

5
È la sintassi dattiloscritta
Daniel

10
import / export - è la sintassi JavaScript (ES6)
alexpods

3
Sarebbe bello se una delle risposte spiegasse davvero perché dobbiamo importare HttpModulee cosa fa.
Drazen Bjelovuk,

Risposte:


520

Importa HttpModule

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

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

platformBrowserDynamic().bootstrapModule(AppModule);

Idealmente, dividere questo codice in due file separati. Per ulteriori informazioni leggi:


2
Nell'attuale Angular2 beta viene chiamato il file app.ts.
d135-1r43,

7
Nei progetti generati da angular-cli, viene chiamato il file main.ts.
Filoxo,

cosa succede se non ho un NgModule? Sto sviluppando un modulo angular2 e non ha un NgModule ma per i test ho bisogno del provider Http
iRaS

@Webruster Ho appena controllato. Dovrebbe funzionare ancora. Potete darmi il codice di errore esatto?
Filippo,

2
@PhilipMiglinci ... grazie per la preziosa risposta .. aggiungendo alcuni punti per i cercatori che il file sarebbe app.module.ts in angolare 2.0 per la spiegazione questo è il file principale del progetto per includere i moduli che useranno ulteriormente ereditati classi.
Shaan gola,

56

> = Angolare 4.3

per l'introduzione HttpClientModule

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

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

Angolare2> = RC.5

Importa HttpModulenel modulo in cui lo usi (qui ad esempio il AppModule:

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

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

L'importazione di HttpModuleè abbastanza simile all'aggiunta HTTP_PROVIDERSnella versione precedente.


9

Con la versione Angular 2.0.0 del 14 settembre 2016, stai ancora utilizzando HttpModule. Il tuo principale app.module.tssarebbe simile a questo:

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

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

Quindi nel tuo app.tsbootstrap puoi:

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

platformBrowserDynamic().bootstrapModule(AppModule);

9

Aggiungi HttpModule per importare l'array nel file app.module.ts prima di utilizzarlo.

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

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


9

Da rc.5 devi fare qualcosa del genere

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

platformBrowserDynamic().bootstrapModule(AppModule);


5

Importa HttpModulenel tuo file app.module.ts.

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

Ricorda inoltre di dichiarare HttpModule sotto importazione come di seguito:

imports: [
    BrowserModule,
    HttpModule
  ],

4

Il modo migliore è cambiare il decoratore del componente aggiungendo Http nell'array dei provider come di seguito.

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

Chi mai lo ha contrassegnato come sbagliato, posso sapere qual è la ragione?
Shivang Gupta,

5
Non ho effettuato il downgrade, ma la ragione è probabilmente che non si desidera un nuovo Httpoggetto per ciascun componente. Meglio averne uno solo per l'app, che si ottiene importandolo a NgModulelivello.
Ted Hopp,

3

a partire da RC5 è necessario importare HttpModule in questo modo:

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

quindi includere HttpModule nella matrice delle importazioni come menzionato sopra da Günter.


3

Includi solo le seguenti librerie:

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

e includi la classe http nella providerssezione, come segue:

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

3

Se si verifica questo errore nei test, è necessario creare un servizio falso per tutti i servizi:

Per esempio:

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

E prima di ogni

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

3
**

Soul soul semplice: importa HttpModule e HttpClientModule su 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 { }

Questa soluzione funziona, ma HttpModule è contrassegnato come obsoleto in Angular 5.2. Penso che alcuni componenti non siano aggiornati e utilizzino ancora la vecchia implementazione Http.
Sobvan,

1

Tutto quello che devi fare è includere le seguenti librerie in tour app.module.ts e includerlo anche nelle tue importazioni:

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

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

1

Ho riscontrato questo problema nel mio codice. Ho inserito questo codice solo nel mio app.module.ts.

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

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

1
Per favore non ripetere le risposte esistenti. In questo modo non si aggiunge valore alla comunità.
Isherwood,

1

import { HttpModule } from '@angular/http'; pacchetto nel file module.ts e aggiungerlo nelle importazioni.


1

Ho appena aggiunto entrambi questi nel mio app.module.ts:

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

&

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

Ora funziona benissimo .... E non dimenticate di aggiungere il

@NgModule => Imports:[] array

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.