typescript - Angular 2. Http map\subscribe-problem


vill läsa JSON-fil och bygga settingsProvider.

Så jag gör det på det här sättet:

import {Http} from "angular2/http";
import {Injectable} from "angular2/core";

@Injectable()
export class SettingsProvider{
    url: string = "";
    constructor(http: Http){
        http.request('js/app/config/config.json').map(data => data.json()).subscribe(data => this.url = data.url);
    }

    getUrl():string {
        return this.url;
    }

}

Men fick ett fel som detta:

Så, min första fråga är - varför så?

Andra frågan:

När jag gör så här:

http.request('js/app/config/config.json').subscribe(data => {
            this.url = data.json().url;
        });

this pekar inte på klassen, utan på Subscriber-instansen. Varför så? Jag trodde att "fat-arrow"-lambda i TypeScript hjälper oss att bli av med denna konstiga closure.

Svar #1

Map-funktionen behöver importeras från RXJS, försök till exempel:

 import 'rxjs/add/operator/map';

Det finns inget behov av att göra HTTP-förfrågan inuti konstruktorn, du borde göra det till sin egen metod. Ett exempel från för ett tag sedan som jag gjorde med namnen ändrade så att det blir mer begripligt i ditt sammanhang:

@Injectable()
export class SettingsProvider{

  constructor(public http: Http) {
  }

  getSettings() {
    //http request code here
  }
}

Jag kan inkludera mer kod senare om du inte får det att fungera baserat på detta. Importen borde åtminstone lösa ditt kartproblem.

Svar #2

Jag får också ett sådant fel när jag försöker hämta branch-json, så jag ändrar i kartan. Jag använde $.parseJSON(res._body), och det fungerar bra.

getbranch(){ return this.http.get("/branch").map( res => $.parseJSON(res._body) ).subscribe( data => this.branches=data ,error => alert('Ingen data hittades') )}