KnockoutJS:在将数据传递给服务器之前排除计算的observable

时间:2013-05-29 04:43:48

标签: javascript knockout.js

我不确定这样做的最佳方法是什么。但是在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";
        }
    }
});

有什么想法吗?

谢谢!

1 个答案:

答案 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;
};

Here's an example