通过knockout mapping插件更新嵌套模型

时间:2014-03-17 09:58:51

标签: knockout.js

我有包含其他模型的模型的自定义挖空映射。

var InnerModel = function(data) {
    var self = this;
    ko.mapping.fromJS(data, {}, self);   

    var customVar = true;
};

var Model = function() {
    var self = this;
    var customMapping = {
            'InnerModel': {
                update: function (options) {
                    return ko.observable(new InnerModel(options.data));
                }
            }
    };    
    ko.mapping.fromJS(forecastData, customMapping, self);   

}

第一次创建模型时,此工作正常。但是,当模型更新时(当通过ajax再次加载数据时),这不能正常工作。

原因是我无需在new InnerModel上创建update。在new InnerModel期间,我丢失了InnerModel中创建的自定义属性的某些值。例如,默认情况下我InnerModel.customVar设置为true,但稍后在某些操作期间它的值为false。但是如果我进行映射,它总是会回到true

如何正确编写更新映射?

1 个答案:

答案 0 :(得分:0)

customVar正在重置为true,因为在Model映射选项中,您正在调用new InnerModel(options.data)并且customVar设置为trueInnerModel函数中。同样,如果您在该函数中有var customVar = false;,则每次更新模型customVar时都会将其重置为false。

一个简单的解决方案是告诉Knockout映射插件忽略该属性。所以你的功能可以改为:

var InnerModel = function(data) {
    var self = this,
        mappingOpt = {
           'ignore': ['customVar']
        };
    ko.mapping.fromJS(data, mappingOpt, self);   

    var customVar = true;
};

这样,每次实例化新的InnerModel customVar都会设置为true;并且对模型的任何后续更新(通过AJAX或其他方式)将忽略该属性的值并保持原样。

修改

再次查看问题,我意识到如果customVar是纯粹的客户端属性(不是AJAX更新中包含的属性),我的上述答案将无法解决您的问题。在这种情况下,问题不适用于映射插件 - 这是因为当您更新模型时,您正在即时对齐具有InnerModel的新customVar设为true

因此,您必须自己实施一些自定义逻辑,以保留customVar的现有值。