首页 > 解决方案 > Angular 5.2.10 - TypeScript 2.4.2 属性访问器 json 映射

问题描述

我有一个问题,我似乎无法找到解决方案,或者我的搜索错误。问题如下:

背景

我有一个 BookingEvent 类,定义如下:

export class BookingEvent {
    title: string;

    private _startDate: Date;

    set startDate(value: Date) {
        let valueMoment = moment(value);
        if (valueMoment.isValid()) this._startDate = valueMoment.toDate();

    }

    get startDate(): Date {
        return this._startDate;
    }

    private _endDate: Date;

    set endDate(value: Date) {
        let valueMoment = moment(value);
        if (valueMoment.isValid()) this._endDate = valueMoment.toDate();
    }
}

除了上述之外,我还有一个带有模板的表单组件,它对属性进行了两种方式的绑定。

问题

当我将表单数据保存到远程 api 时,我意识到 json 生成的将我的startDateendDate绑定属性分别映射为_startDate_endDate ,如下所示:

{
        "title": "My awesome event",
        "_startDate": "2018-04-26T20:50:00.000Z",
        "_endDate": "2018-04-27T19:50:00.000Z"
    }

问题

为什么本机 json 映射器使用私有属性名称而不是公共属性名称?如何确保使用公共属性名称?

标签: jsonangulartypescript

解决方案


您可以指定一种toJSON()方法来自定义对象在使用 序列化时的外观JSON.stringify(...)。该链接详细说明了它如何确定要包含在被序列化的对象中的内容。JavaScript 没有私有属性的概念,所以它们就像其他任何东西一样只是属性。

class BookingEvent {
    // all the rest of your code

    toJSON() {
        return {
            title: this.title,
            startDate: this.startDate,
            endDate: this.endDate
        }
    }
}

推荐阅读