【问题标题】:when i parse my http response to object in angular 2 it don't parse the functions?当我解析我对角度 2 中对象的 http 响应时,它不解析函数吗?
【发布时间】:2018-02-09 10:25:34
【问题描述】:

这是我的打字稿课

import { Hours } from "./hours";


export class Day {
            public dayName: string;
            public dayId: number;
            public dayStatus: string = "Closed";
            public checked: boolean = false;
            public hours: Hours[] = new Array();


consturctor() {

}


public equals( dayid: number ): boolean {

    if ( this.dayId == dayid ) {
        return true;
    }

    return false;
}

public isChecked() {
    let result: boolean;
    if ( this.dayStatus == "Open" ) {
        result = true;
    }
    else {
        result = false;
    }
    return result;
}
}

当我将这个对象发送到我在 java spring 中的 rest 服务时,它会将对象保存到数据库中,但是当我从数据库中取回这个对象时,我得到了所有字段,但是当我尝试访问 equals 方法时,我得到了错误等于不是方法。响应的 proto 在下面

      __proto__
     :
      constructor
      :
    ƒ Object()
    hasOwnProperty
    :
    ƒ hasOwnProperty()
    isPrototypeOf
    :
    ƒ isPrototypeOf()
    propertyIsEnumerable
    :
    ƒ propertyIsEnumerable()
    toLocaleString
    :
    ƒ toLocaleString()
    toString
    :
   ƒ ()
     valueOf
   :
   ƒ valueOf()
  __defineGetter__
   :
   ƒ __defineGetter__()
  __defineSetter__
   :
   ƒ __defineSetter__()
   __lookupGetter__
     :
    ƒ __lookupGetter__()
    __lookupSetter__
     :
    ƒ __lookupSetter__()
    get __proto__
    :
     ƒ __proto__()
    set __proto__
     :
      ƒ __proto__()

它没有相等的方法。如果我做一个新的一天();我得到下面的平等方法是我如何得到请求的代码

       this.http.get(url,options).map((res)=>res.json()).
       subscribe((data)=>{ obj=data});

** 编辑 **

这是我发送到服务器的 json

    Day
    checked: true
    dayId:1
    dayName:"Monday"
    dayStatus:"Open" 
    hours:[Hours]
    __proto__:
     consturctor:ƒ ()
     equals:ƒ (dayid)
     isChecked:ƒ ()
     constructor:ƒ Day() 
    __proto__:Object

在请求正文中变成这个

          {
  "dayStatus": "Open",
  "checked": true,
  "hours": [
    {
      "startAt": "00:00",
      "closeAt": "23:59",
      "maxPatientNo": "20"
    }
  ],
  "dayId": 4,
  "dayName": "Thursday"
}

我得到了所有的字段。

【问题讨论】:

  • 您能否提供一个发送到服务器的 JSON 示例?此外,当您执行http.get 时,您从服务器收到的 JSON 示例?通常只有数据被发送到服务器。当您在后续查询中从服务器获取数据时,您只需从该数据构造一个新的类实例。

标签: json angular typescript jsonparser


【解决方案1】:

正如我在评论中提到的,通常是你

  • 在客户端与数据交互
  • 将数据发送到您的服务器(用于验证/持久性/等)

当您稍后向服务器查询此数据时,您会收到数据。行为不会通过线路传输,如果需要,您可以从该数据构造一个类的新实例。

例如,使用以下实现:

export class Day {
    public dayName: string;
    public dayId: number;
    public dayStatus: string;
    public checked: boolean;
    public hours: Hours[];


    // the default constructor
    constructor(name: string, id: number, status?: string, checked?: boolean, hours?: Hours[]) {
        this.dayName = name;
        this.dayId = id;
        this.dayStatus = status || 'closed';
        this.checked = checked || false;
        this.hours = hours || [];
    }

    // static method that calls the constructor
    // this is just like a constructor overload in other languages
    public static fromObject(object: any) {
        const {dayName, dayId, dayStatus, checked, hours} = object;
        return new this(dayName, dayId, dayStatus, checked, hours);
    }


    public equals( dayid: number ): boolean {

        if ( this.dayId == dayid ) {
            return true;
        }

        return false;
    }

    public isChecked() {
        let result: boolean;
        if ( this.dayStatus == "Open" ) {
            result = true;
        }
        else {
            result = false;
        }
        return result;
    }

}

你可以这样使用它:

this.http.get(url, options)
    .map(res => res.json())
    .map(parsed => Day.fromObject(parsed))
    .subscribe(day => this.receivedDay = day);

【讨论】:

  • 你是对的,它只发送对象的数据,但我想知道有没有一种方法可以将我的响应转换为新对象,上面使用的方法可以正常工作,但问题在于这天对象有一个小时对象数组,小时对象也有 equals 方法来检查那个小时是否相等,所以即使我使用 new Day() 我在使用 hour.equal 方法时仍然会出错。
  • @ashutosh 在解析对象时,不妨先做hourInstances = parsed.hours.map(parsedHours => Hours.from(parsedHours),然后将hourInstances传递给Day构造函数。没有充分的理由将行为方法存储在服务器端。
  • @ashutosh 只要你可以从它的属性中重构一个类,原生的JSON.stringify 就足够了,并且会为你工作。它还将正确地对嵌套类实例的属性进行字符串化。但是,如果您需要一些特殊的序列化,我想您也可以在您的类中添加某种 .toJSON 方法。
  • 我同意我不想在服务器上存储行为方法我正在寻找某种角度的函数可以解决这个解决方案现在我也在考虑在类中创建一个序列化方法我应该创建一个带参数的构造函数还是在该方法中创建一个新对象并将其作为结果返回。
  • @ashutosh 我不太确定你在寻找什么样的功能。你到底想在这里解决什么问题?
猜你喜欢
  • 2011-08-09
  • 2017-12-04
  • 2021-10-14
  • 1970-01-01
  • 2012-07-07
  • 2020-05-27
  • 2021-08-24
  • 2019-12-05
  • 1970-01-01
相关资源
最近更新 更多