我不确定这样做的最佳方法是什么。但是在http://knockoutjs.com/documentation/computedObservables.html中有一节说“确定属性是否是计算的可观察值”。我使用isComputed
检查属性是否是计算的observable。
我想在将值传递给服务器之前从self.formItems()
中排除/删除计算的observable。
以下是我的代码的一部分,其中包含将数据发送回服务器的AJAX请求。
for (var prop in self.formItems()) {
// console.log(ko.isComputed(self.formItems()[prop].isRadio)); //true (because this is computed)
// console.log(ko.isComputed(self.formItems()[prop].field_label)); //false (because this is not a computed element)
for(var form_prop in self.formItems()[prop]) {
// console.log(form_prop+': '+ko.isComputed(self.formItems()[prop][form_prop]));
if(self.formItems()[prop].hasOwnProperty(form_prop) && !ko.isComputed(self.formItems()[prop][form_prop])) {
// result_no_computed_observables[prop][form_prop] = ko.toJS(self.formItems()[prop][form_prop]);
console.log(self.formItems()[prop][form_prop]);
}
// ko.cleanNode(self.formItems()[prop][form_prop])
}
}
$.ajax({
'type': 'POST',
'url': appUrl+'/editors/saveform/'+memberListId+'.json',
'cache': false,
'dataType': 'json',
'contentType': 'application/json',
'data': ko.toJSON({
'id': theFormDetails.id(),
'name': theFormDetails.name(),
'description': theFormDetails.description(),
'success_text': theFormDetails.success_text(),
'success_redirect': theFormDetails.success_redirect(),
'form_elements': self.formItems() /* <--- I would like to remove computed observables from this*/
}),
'success': function(result) {
alert('success!!!');
},
'statusCode': {
403: function() {
alert("Your session has probably expired. Please login again.");
window.location = appUrl+"/users/login";
}
}
});
有什么想法吗?
谢谢!
答案 0 :(得分:5)
首先,我建议使用mapping plugin,这使得这很容易。这是一个可选的插件,您需要下载和参考。这允许您将配置属性传递到序列化和反序列化函数,以准确控制哪些字段被序列化以及如何进行序列化。基本上,你可以做类似的事情:
var json = ko.mapping.toJS(model, { ignore: ['form_elements'] });
从模型中排除form_elements
属性。
在不使用插件的情况下执行此操作的另一种方法是覆盖toJSON
方法。类似的东西:
viewModel.prototype.toJSON = function() {
var copy = ko.toJS(this);
delete copy.form_elements; // Remove form_elements field
return copy;
};