Ko.toJSON () работает с датами? - PullRequest
7 голосов
/ 10 мая 2011

Я использую knockoutjs на странице asp.net mvc. Я использую 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!');
    }
});

Значение console.log для viewModel.startTime ():

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"
}

Если развернуть строку 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 для обработки объекта date?

Ответы [ 2 ]

3 голосов
/ 11 мая 2011

Учитывая текущую проблему с ko.toJS и датами, можно было бы создать зависимый объект, содержащий реальное значение, с которым вы хотите иметь дело с сервером.

Что-то вроде:

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 для объектов Date.

1 голос
/ 19 февраля 2013

У меня была проблема с ko.toJSON() из-за неправильного формата даты, когда дата была DateTime.MinValue.

Хотя, возможно, это не исправление вашей проблемы, это исправление помогло моей ko.toJSON() дате:

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

Сбой ASP.Net WebMethod, поскольку ko.toJSON () выдает разные результаты для DateTime.MinValue

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...