2011-05-09 19 views
7

Estoy usando knockoutjs en una página asp.net mvc. Estoy usando ajax para persistir un formulario de regreso al servidor llamando al ko.toJSON(viewModel) y luego publicando los resultados en el servidor usando jQuery. Todas las propiedades del modelo de vista se serializaron con éxito, excepto la fecha de Javascript, que se conserva como un objeto vacío.¿Ko.toJSON() funciona con fechas?

Declaración:

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

Guardar datos:

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!'); 
    } 
}); 

El valor de console.log viewModel.startTime() es:

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

Después de la línea 1 del Guardar datos, el valor de Postdatum es:

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

Si amplío la línea 1 del Guardar datos a

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

El valor de Postdatum es :

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

¿Alguien puede explicar lo que podría estar pasando y cómo podría obtener knockouts para manejar el objeto de fecha?

+1

hay un problema registrado para este de aquí: https://github.com/SteveSanderson/knockout/issues/55. ¿Estás de acuerdo con el formato en tu último ejemplo? –

+0

Excelente. ¡Gracias! Formato Wrt, ¿te refieres a la extensión completa SaveData o la línea 1 de SaveData? Soy nuevo en jquery, ajax y knockoutjs, así que no dude en transmitir cualquier consejo que pueda tener. La expansión de la línea 1 es básicamente una implementación por ignorancia (deje que el framework haga lo suyo y luego corrija el mal valor). – Jason

+0

Sí, si ese es el valor que desea, la siguiente respuesta sería otra forma de hacerlo. ¡Buena suerte! –

Respuesta

3

Dado el problema actual con ko.toJS y las fechas, una opción sería crear un dependObservable que contenga el valor real que desea que el servidor trate.

Algo así como:

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); 

Ahora, cuando se llama ko.toJSON usted conseguirá la startTime con el valor correcto que el servidor podría utilizar.

Para navegadores más antiguos, algo como json2.js incluiría .toJSON para objetos Date.

+0

Gracias. Esa es una mejor solución. Es una lástima que tengamos que evitarlo. – Jason