2011-05-09 140 views
7

我在asp.net mvc頁面上使用了knockoutjs。我使用ajax通過調用ko.toJSON(viewModel)將表單持久化回服務器,然後使用jQuery將結果發回服務器。視圖模型上的所有屬性都被成功序列化,除了保留爲空對象的Javascript日期之外。ko.toJSON()與日期一起工作嗎?

宣言:

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

如果我擴大保存數據線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來處理日期對象?

+1

有一個問題記錄這一個位置:https://github.com/SteveSanderson /淘汰賽/問題/ 55。 你還好在最後一個例子中的格式? – 2011-05-10 04:10:30

+0

優秀。謝謝! Wrt格式,是指完整的SaveData還是SaveData的第1行擴展?我是jquery,ajax和knockoutjs的新手,所以請隨時傳遞您的建議。第1行擴展基本上是一個無知的實現(讓框架做它的事情,然後修復不良的值)。 – Jason 2011-05-11 13:20:09

+0

是的,如果那是你想要的價值,那麼下面的答案是另一種方法。祝你好運! – 2011-05-11 16:45:48

回答

3

鑑於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。

+0

謝謝。這是一個更好的解決方法。這太糟糕了,我們必須儘快解決它。 – Jason 2011-05-12 13:48:31