有没有办法控制ko.toJS/ko.toJSON?
问题描述:
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
我有许多领域,也日期(当地文化格式)。
答
您可能会更好地保留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由瑞恩·尼迈耶,说明这究竟是如何完成的。