Knockout.js 通过敲除映射插件更新嵌套模型

Knockout.js 通过敲除映射插件更新嵌套模型,knockout.js,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': {

我为包含其他模型的模型定制了敲除映射

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再次加载数据时),这并不能正常工作

原因是我不需要在
update
上创建
新的InnerModel
。在
newinnermodel
期间,我丢失了在
InnerModel
中创建的一些自定义属性的值。例如,我有
InnerModel.customVar
,默认设置为
true
,但是,在以后的一些操作中,它的值为
false
。但是如果我进行映射,它总是被设置回
true


如何正确编写更新映射?

customVar
正在重置为
true
,因为在
Model
映射选项中,您正在调用
new InnerModel(options.data)
,并且您的
InnerModel
函数中将
customVar
设置为
true
。同样,如果您有
var customVar=falsecustomVar
时,都会将其重置为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

值。我确实理解您编写的所有内容,我知道这一点。然而,我仍然无法找到我的问题的答案。在更新过程中创建“新模型”不是没有方法,而是在“init”上创建,而是在“update”上更新吗。我无法更新它。