2012-11-29 102 views
2
var mappingSetting = { 
    'user' : { 
     create: function(options.data){ 
      options.data.isActive = options.data.isActive == 1 ? 'Yes' : 'No'; 
      options.data.startDate = $.datepicker.format('dd/MM/yy', options.data.startDate) 
      return options.data; 
      } 
    } 
}; 

var viewModel = {}; 

$.ajax({ 
    url: '/api/users/GetAll', 
    ..... 
    success: functions (data) { 
     viewModel = ko.mapping.fromJS(data, mappingSetting); 
     ko.applyBindings(viewModel); 
    }, 
}); 

$("#savebtn").click(function(){ 
    var dataToSave = ko.toJS(viewModel); 
    // ajax call to save 
}); 

AJAX結果有沒有辦法控制ko.toJS/ko.toJSON?

[{username: 'users1', isActive:1, startDate:'2001-03-22T00:00:00CET'}, {username: 'users2', isActive:0, startDate:'2008-03-22T00:00:00CET'}] 

我必須表明是/否isActive的基礎上,但同時節省我不得不更改回0/1

我有許多領域,也日期(當地文化格式)。

回答

1

您可能會更好地保留isActive作爲布爾值,並使用計算函數或自定義綁定處理程序在給定isActive值的情況下顯示「是」/「否」。

自定義綁定處理程序

ko.bindingHandlers.formatBool = { 
    update: function(element, valueAccessor, allBindingsAccessor) { 
    var value = ko.utils.unwrapObservable(valueAccessor()); 
    var text = value ? "Yes" : "No"; 

    ko.bindingHandlers.text.update(element, function() { return text; }); 
    } 
}; 

這裏有一個jsFiddle作爲一個例子。

計算的「格式化」價值

由於您使用的映射插件來構建一個完整的視圖模型,這可能不是最好的解決辦法,但它通常是有用的使用計算格式化其他可觀察值。

viewModel.options.data.isActive.formatted = ko.computed(function(){ 
    return viewmodel.options.data.isActive ? "Yes" : "No"; 
}); 

覆蓋的toJSON

這就是說,如果你真的喜歡重寫您toJS /的toJSON功能,您可以覆蓋你的視圖模型的方法。

viewModel.toJSON = function(){ 
    var copy = ko.toJS(this); 
    copy.isActive = copy.isActive === "Yes" ? 1 : 0; 
    return copy; 
} 

這裏有一個great article由瑞恩·尼邁耶,說明這究竟是如何完成的。

相關問題