一尘不染

ko.toJSON()是否可用于日期?

ajax

我在asp.net
mvc页面上使用knockoutjs。我正在使用ajax通过调用将表单持久化回服务器ko.toJSON(viewModel),然后使用jQuery将结果发布回服务器。视图模型上的所有属性均已成功序列化,但Javascript日期除外,该Javascript日期保留为空对象。

宣言:

var viewModel = {
    startTime: ko.observable(),
    type: ko.observable(),
    durationInMinutes: ko.observable(),
    notes: ko.observable()
};

保存数据:

var postData = ko.toJSON(viewModel); 
$.ajax({
    url: "/data",
    type: "POST",
    data: postData,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function () {
        console.log('success!');
    },
    error: function () {
        console.log('fail!');
    }
});

viewModel.startTime()的console.log值为:

Date {Tue May 10 2011 11:30:00 GMT-0500 (Central Daylight Time)}

Save Data的 第1行之后,postData的值为:

{
    "startTime": {},
    "type": "1",
    "durationInMinutes": "45",
    "notes": "asfasdfasdfasdfasdfasdfasdfas",
    "displayableStartTime": "10-May 11:30"
}

如果我将“ 保存数据”的 第1行扩展到

var jsonEvent = ko.toJS(viewModel);
jsonEvent.startTime = viewModel.startTime();
var postData = JSON.stringify(jsonEvent);

postData的值为:

{
    "startTime": "2011-05-10T16:30:00.000Z",
    "type": "1",
    "durationInMinutes": "45",
    "notes": "asfasdfasdfasdfasdfasdfasdfas",
    "displayableStartTime": "10-May 11:30"
}

谁能解释可能发生的事情以及我如何能够使用基因敲除法来处理日期对象?


阅读 212

收藏
2020-07-26

共1个答案

一尘不染

鉴于ko.toJS和date的当前问题,一种选择是创建一个包含您希望服务器处理的实际值的dependentObservable。

就像是:

var viewModel = {
    startTimeForInput: ko.observable(),
    type: ko.observable(),
    durationInMinutes: ko.observable(),
    notes: ko.observable()
};

viewModel.startTime = ko.dependentObservable(function() {
    return this.startTimeForInput().toJSON();
}, viewModel);

ko.applyBindings(viewModel);

现在,当您致电时,ko.toJSON您将获得startTime具有服务器可以使用的正确值的。

对于较旧的浏览器,类似json2.js的对象将包括.toJSON for Date对象。

2020-07-26