2017-01-25 6 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); 
    } 
} 

Почему он говорит, что 'Property' serviceData 'не существует в типе GeoService'?'Property' serviceData 'не существует в типе' GeoService '.' Typcript Angular2

+0

где вы точно определили 'private serviceData: any;'? – anshuVersatile

+0

@anshuVersatile no я еще не определился – Sajeetharan

+0

добавьте его перед конструктором и попробуйте сделать его 'publc' – anshuVersatile

ответ

3

Ну, это не так, когда вы в своей extractData попытаетесь обратиться к this.serviceData, вы не указали его нигде в вашем сервисе.

Try:

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

Другой вариант, что вы в вашей службе фактически объявить serviceData, то вы можете использовать this в вашей функции.

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

теперь он работает, я не получаю никакого resullt в 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