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

为什么它说'属性'serviceData'不存在于类型GeoService'?

最佳答案

好吧,事实并非如此,当您在 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 || {};
}

另一种选择是你在你的服务中实际声明了 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 方法中执行此操作。

关于angular - '属性 'serviceData' 在 'GeoService' 类型上不存在。' typescript Angular2,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41850900/

10-11 11:38