2017-01-25 15 views
4
import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/Rx'; 
import {Observable} from 'rxjs/Rx'; 
import 'rxjs/add/operator/toPromise'; 
@Injectable() 
export class GeoService { 
    constructor(private http: Http) { } 

    private extractData(res : any){ 
     if(res.status < 200 || res.status >=300){ 
      throw new Error('Bad response sttus:' + res.status); 
     } 
     this.serviceData = (res.json()); 
     return this.serviceData || {}; 
    } 

    loaddata(term: string): Observable<any> { 
    return this.http.get('http://maps.google.com/maps/api/geocode/json?address=' + term + 'CA&sensor=false') 
     .map(this.extractData); 
    } 
} 

なぜ 'service'が 'GeoServiceタイプ'に存在しません。'プロパティ' serviceData 'はタイプ' GeoService 'に存在しません。'型文字Angular2

+0

あなたは 'private serviceData:any;'を正確に定義していますか? – anshuVersatile

+0

@anshuVersatileいいえどこにも定義されていません – Sajeetharan

+0

コンストラクタの前に追加して 'publc'にしてみましょう – anshuVersatile

答えて

3

あなたのextractData関数でthis.serviceDataを参照しようとすると、サービスのどこにでも宣言していません。

試してみてください。

private extractData(res : any){ 
    if(res.status < 200 || res.status >=300){ 
     throw new Error('Bad response sttus:' + res.status); 
    } 
    let serviceData = res.json(); // declare here! 
    return serviceData || {}; 
} 

その他のオプションは、あなたのサービスでは、あなたが実際にあなたがあなたの関数でthisを使用することができ、のserviceDataを宣言することです。

export class GeoService { 
    private serviceData; 
    .... 

// and then use this: 
private extractData(res : any){ 
    if(res.status < 200 || res.status >=300){ 
     throw new Error('Bad response sttus:' + res.status); 
    } 
    this.serviceData = (res.json()); 
    return this.serviceData || {}; 
} 

} 

その後、コンポーネントでこれらを使用することができ、それはそう、あなたのOnInit方法やあなたのコンストラクタのように、サービス内の関数を呼び出している:

data; // declare a variable where you want to store the data 

constructor(private geoService: GeoService) { 
    this.geoService.loaddata() 
    .subscribe(data => { 
     this.data = data; 
     console.log(this.data); // your values here! 
    }); 
} 

私はあなたがこれを行うことをお勧めしかし、OnInitメソッド。

+0

今度は最後の行に表示されます – Sajeetharan

+0

申し訳ありません、更新された回答、余分な「this」がありました。 ) – Alex

+0

今、それは動作します、私はapp.component – Sajeetharan

1
import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/Rx'; 
import {Observable} from 'rxjs/Rx'; 
import 'rxjs/add/operator/toPromise'; 
@Injectable() 
export class GeoService { 
    public serviceData:any; 
    constructor(private http: Http) { } 

    private extractData(res : any){ 
     if(res.status < 200 || res.status >=300){ 
      throw new Error('Bad response sttus:' + res.status); 
     } 
     this.serviceData = (res.json()); 
     return this.serviceData || {}; 
    } 

    loaddata(term: string): Observable<any> { 
    return this.http.get('http://maps.google.com/maps/api/geocode/json?address=' + term + 'CA&sensor=false') 
     .map(this.extractData); 
    } 
} 
+0

他の場所で 'GeoService.serviceData'にアクセスしようとしていると思います – anshuVersatile

関連する問題