2016-08-11 1 views
9

In Angular 2 RC 4 gelesen habe ich eine Klasse HttpLoading, die die ursprüngliche Http-Service von Angular 2.Angular 2 RC 5 Bootstrap benutzerdefinierte HTTP-Klasse Typeerror: kann Eigenschaft 'toString' von null

Mit RC 4 I erweitert wurde Lage, das ohne Problem mit dem folgenden Code in Bootstrap zu verwenden:

bootstrap(AppComponent, [ 
    HTTP_PROVIDERS, 
    provide(RequestOptions, { useClass: DefaultRequestOptions }), 
    provide(Http, { 
     useFactory: (backend: XHRBackend, defaultOptions: RequestOptions) => new HttpLoading(backend, defaultOptions), 
     deps: [XHRBackend, RequestOptions] 
    }) 
]).catch(err => console.error(err)); 

Meine DefaultRequest Optionen Klasse

import { Injectable } from '@angular/core'; 
import { Headers, BaseRequestOptions } from '@angular/http'; 

@Injectable() 
export class DefaultRequestOptions extends BaseRequestOptions { 
    headers: Headers = new Headers({ 
     'Content-Type': 'application/json' 
    }); 
} 

Meine HttpLoading Klasse sieht wie folgt aus:

import { Http, RequestOptionsArgs, ConnectionBackend, RequestOptions, Response } from '@angular/http' 
import { Injectable } from '@angular/core' 
import {GlobalService} from './globalService'; 
import { Observable } from 'rxjs/Observable'; 

export class HttpLoading extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _globalService: GlobalService) { 
     super(backend, defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<any> { 
     this._globalService.isLoading = true; 
     return super.get(url, options) 
      .map(res => { 
       this._globalService.isLoading = false; 
       return res.json(); 
      }) 
      .catch(this.handleError); 
    } 
} 

mit kantigem 2 RC 5 die Art und Weise Bootstrap wurde geändert und wir müssen jetzt NgModule und Bootstrap, dass haben. Ich habe den Migrationsleitfaden gefolgt und erstellt meinen unter NgModule:

import { NgModule }  from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 
import { HttpModule }  from '@angular/http'; 
import { Http, HTTP_PROVIDERS, RequestOptions, XHRBackend } from '@angular/http'; 

import { DefaultRequestOptions } from './DefaultRequestOptions'; 
import { HttpLoading } from './http-loading'; 

import { routing }  from './app.routing'; 
import { AppComponent } from './components/app.component'; 


@NgModule({ 
    imports: [ 
     BrowserModule, 
     FormsModule, 
     ReactiveFormsModule, 
     HttpModule, 
     routing 
    ], 
    declarations: [ 
     AppComponent 
    ], 
    providers: [ 
     HTTP_PROVIDERS, 
     { provide: RequestOptions, useClass: DefaultRequestOptions }, 
     { 
      provide: Http, 
      useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, globalService: GlobalService) => new HttpLoading(backend, defaultOptions, globalService), 
      deps: [XHRBackend, RequestOptions, GlobalService] 
     }, 
GlobalService 
    ], 
    bootstrap: [AppComponent], 
}) 
export class AppModule { } 

Aber jetzt, wenn ich es verwende in meiner Komponente, es keine Anforderung an dem Server und durch folgende Fehler in der Konsole gesendet:

EXCEPTION: Error: Uncaught (in promise): TypeError: Cannot read property 'toString' of null 

Meine Komponente, in der ich bin mit http unter:

import { Component, OnInit } from '@angular/core'; 
import { Http } from '@angular/http'; 

@Component({ 
    templateUrl: '../../templates/home/home.html' 
}) 
export class HomeComponent implements OnInit { 

    constructor(private http: Http) {} 

    ngOnInit() { 
     this.http.get('/home') 
      .subscribe((data) => { 

      }); 
    } 
} 

Kann jemand bitte leite?

Antwort

1

Sie so viel jeder für Ihre Hilfe danken, ich war in der Lage, das Problem zu lösen, indem sie Entfernen

{ provide: RequestOptions, useClass: DefaultRequestOptions }, 

, die mit RC 5.

+0

Brauchen wir HTTP_PROVIDERS? – Sandeep

2

Vielleicht ist es ein Tippfehler, aber ich kann die GlobalService Klasse in den Anbietern Ihrer NgModule nicht sehen:

@NgModule({ 
    imports: [ 
     BrowserModule, 
     FormsModule, 
     ReactiveFormsModule, 
     HttpModule, 
     routing 
    ], 
    declarations: [ 
     AppComponent 
    ], 
    providers: [ 
     HTTP_PROVIDERS, 
     GlobalService, // <---------- 
     { provide: RequestOptions, useClass: DefaultRequestOptions }, 
     { 
      provide: Http, 
      useFactory: (backend: XHRBackend, defaultOptions: RequestOptions, globalService: GlobalService) => new HttpLoading(backend, defaultOptions, globalService), 
      deps: [XHRBackend, RequestOptions, GlobalService] 
     } 
    ], 
    bootstrap: [AppComponent], 
}) 
export class AppModule { } 
+0

Thierry, sorry, das war nur Tippfehler in th zu sein unnecassary scheint Die Frage. In meinem Code habe ich dies in der Anbieterliste aber es wirft immer noch Fehler auf. "Error: Uncaught (in Versprechung): TypeError: Kann Eigenschaft 'toString' von null nicht lesen" –

20

ich die Lösung here gefunden. Ich hatte das gleiche Problem, dass es für mich funktionierte.

nur ein Körper in den get Optionen hinzufügen in:

this.http.get(url, { body: "" }); 

Ich hoffe, es funktioniert auch für Sie

+0

Das funktionierte für mich, danke! – tomaszbak

+1

Für mich auch. Ich hatte das Problem bei einer DELETE-Anfrage. Vielen Dank! –

+0

Ja, erstaunlicherweise hat das auch für mich funktioniert. Ist das beabsichtigtes Verhalten? Sieht für mich wie ein Käfer aus. –

Verwandte Themen