【问题标题】:Does ko.toJSON() work with dates?ko.toJSON() 是否适用于日期?
【发布时间】:2011-08-22 00:23:52
【问题描述】:

我在 asp.net mvc 页面上使用 knockoutjs。我正在使用 ajax 通过调用 ko.toJSON(viewModel) 将表单保存回服务器,然后使用 jQuery 将结果发布回服务器。视图模型上的所有属性都已成功序列化,除了 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)}

保存数据第1行后,postData的值为:

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

如果我将 Save Data 的第 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"
}

谁能解释可能发生的事情以及我如何能够让 knockoutjs 处理日期对象?

【问题讨论】:

  • 这里记录了一个问题:github.com/SteveSanderson/knockout/issues/55。您对上一个示例中的格式满意吗?
  • 优秀。谢谢! Wrt格式,你是指完整的SaveData还是SaveData的第1行扩展?我是 jquery、ajax 和 knockoutjs 的新手,所以请随时传递您可能有的任何建议。第 1 行扩展基本上是出于无知的实现(让框架做它的事情,然后修复错误的值)。
  • 是的,如果这是您想要的值,那么下面的答案将是另一种方法。祝你好运!

标签: ajax json knockout.js


【解决方案1】:

鉴于 ko.toJS 和日期的当前问题,一种选择是创建一个包含您希望服务器处理的实际值的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 之类的内容将包含 Date 对象的 .toJSON。

【讨论】:

  • 谢谢。这是一个更好的解决方法。可惜我们不得不解决它。
【解决方案2】:

当日期为 DateTime.MinValue 时,ko.toJSON() 给了我一个错误的日期格式,我遇到了问题。

虽然可能无法解决您的问题,但此修复程序适用于我的 ko.toJSON() 日期问题:

var postData = JSON.parse(JSON.stringify(ko.toJSON(viewModel)).replace(/\"1-01-01/g, "\"0001-01-01"));

ASP.Net WebMethod fails because ko.toJSON() produces different results for DateTime.MinValue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2017-11-22
    • 2012-02-24
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多