【问题标题】:this does not access http response object:property does not exist on type Object这不会访问 http 响应对象:对象类型上不存在属性
【发布时间】:2017-12-12 12:00:56
【问题描述】:

我有响应对象,我刚刚分配给“this”对象。

private data: Object = {};

this.http.post('url', { })
    .subscribe(
        res => {
            console.log(res);
            this.data = res;

            if(this.data.datacentersinfo.length) {}

...

如果我访问datacentersinfo 对象,它会说属性datacentersinfo 在对象类型上不存在。由于这个错误,我无法生成 dist 文件夹。

【问题讨论】:

    标签: javascript angular typescript ecmascript-6


    【解决方案1】:

    你有几个解决方案:

    1 - 将您的数据输入任何内容并且不要实例化它:

    private data: any;
    

    2 - 改变你的条件:

    if(this.data && this.data.datacentersinfo && this.data.datacentersinfo.length) {}
    

    这应该可以解决您的问题。

    【讨论】:

    • dist 已生成!!
    【解决方案2】:

    我建议你使用强类型对象,如下所示

    import { Injectable } from '@angular/core';
    import { Http, Headers, RequestOptions, 
                 Response, ResponseContentType } from '@angular/http';
    
    GetAllCriteria(): Observable<Array<ClassName>> {
        let headers = new Headers({
            'Content-Type': 'application/json'
        });
        let options = new RequestOptions({ headers: headers });
        return this._http.get(this.apiUrl + "/GetAllCriteria",
                           options).subscribe(response => response.json());
    }
    

    【讨论】:

    • 如果他使用的是HttpClient,但它不会工作。
    • @tricheriche - 在顶部添加这个 import { Http, Headers, RequestOptions, Response, ResponseContentType } from '@angular/http';
    • @tricheriche - 为什么?你认为没有数据..或者它的空值..这是需要我认为 res.json();将行 json 数据转换为 typescript 的对象
    • 否,因为 Angular 将弃用 Http 模块以支持 HttpClient,并且 HttpClient 已经解析了对 JSON 的响应。在他们的 HTTP 指南中 :)
    • 见@Wesley 的回答,他解释了!
    【解决方案3】:

    我将发布这两种方法。首先是旧方式(看起来像您尝试的方式),然后是使用 HTTP 客户端的首选方式

    旧 HTTP

    private data: Object = {};
    this.http.post('url', { })
        .map((res: Response) => res.json())
        .subscribe((res:any) => {
            console.log(res);
            this.data = res;
            if(this.data.datacentersinfo.length) {}
    });
    

    HTTP 客户端

    private data: Object = {};
        this.http.post<any>('url', { })            
            .subscribe((res:any) => {
                console.log(res);
                this.data = res;
                if(this.data.datacentersinfo.length) {}
        });
    

    我这样做并不是最好的方式,您应该创建一个处理 HTTP 请求的服务组件,然后从该组件调用该服务并在那里订阅它的响应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 2018-02-10
      • 2018-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-23
      • 2021-04-02
      相关资源
      最近更新 更多