1

我不确定这样做的最佳方法是什么。但是在http://knockoutjs.com/documentation/computedObservables.html中有一个部分说“确定属性是否是计算的可观察对象”。我曾经isComputed检查过该属性是否是计算出的 observable。

我想self.formItems()在将值传递给我的服务器之前排除/删除计算出的 observables。

这是我的代码的一部分,其中包含将数据发送回服务器的 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";
        }
    }
});

有任何想法吗?

谢谢!

4

1 回答 1

5

首先,我建议使用映射插件,这很容易。这是一个可选插件,您需要下载和参考。这允许您将配置属性传递到序列化和反序列化函数中,以准确控制哪些字段被序列化以及如何序列化。基本上,您可以执行以下操作:

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

这是一个例子

于 2013-05-29T05:02:06.693 回答