我有包含其他模型的模型的自定义挖空映射。
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
。
如何正确编写更新映射?
答案 0 :(得分:0)
customVar
正在重置为true
,因为在Model
映射选项中,您正在调用new InnerModel(options.data)
并且customVar
设置为true
在InnerModel
函数中。同样,如果您在该函数中有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
的现有值。