【发布时间】:2016-06-19 14:47:12
【问题描述】:
我将尝试为我遇到的问题做一个简化的例子。我认为我已经非常接近解决方案了,但我需要你的帮助来画龙点睛。
假设我有一个看起来像这样的视图模型:
function viewModel(){
var self = this;
self.foo = ko.observable();
self.bars = ko.observableArray();
}
function bar(data){
var self = this;
self.baz = ko.observable();
ko.mapping.fromJS(data, mapperSettings, self);
}
我使用ko.mapping plugin 映射来自服务器的一些数据:
var mapperSettings = {
bars: {
create: function(options) {
return new bar(options.data);
}
}
};
var dummyData = {
foo: '1',
bars: [{ baz: 1 }, { baz: 2 }]
};
var vm = new viewModel();
ko.mapping.fromJS(dummyData, mapperSettings, vm);
到目前为止一切都很好。
现在,我想用一些额外的计算属性来增强视图模型及其项。我已经成功地将它添加到视图模型中(下面的something_computed),但是我无法将计算属性添加到列表项中——下面的bar 项上的computed 属性:
var settings = {
create: function(options) {
var model = ko.mapping.fromJS(options.data, {
bars: {
create: function (options) {
// why is this callback called 4 times and not 2?
var self = options.data;
self.computed = ko.computed(function(){
return this.baz() + ' comp';
}, self);
return self;
}
}
});
model.something_computed = ko.computed(function(){
return this.foo() + '...';
}, model);
return model;
}
};
var newViewModel = ko.mapping.fromJS(vm, settings);
ko.applyBindings(newViewModel);
Fiddle
【问题讨论】:
-
@RoyJ 感谢您的链接。据我从各种 SO 线程中可以看出,我在上面的最后一次更新中正确地进行了映射。还是我错过了什么?我无法理解为什么
create回调被调用了两次以上...... -
我认为您应该让您的 create 函数创建一个新对象,而不仅仅是修改并返回您收到的内容。我不知道为什么它会调用四次,但最后两次没有
baz,所以你可以将它们短路。 jsfiddle.net/4s6jsLx1/7 -
是的,我也这么认为。但无论如何,我不明白为什么它被调用了 4 次。不过谢谢
-
你试过在调试器中单步调试映射代码吗?
标签: knockout.js knockout-mapping-plugin