我希望使用Knockout映射来生成ViewModel。
var viewModel = ko.mapping.fromJS(data);
创建ViewModel后,我想添加计算文本元素。
for (var i = 0; i < viewModel.Packages().length; i++) {
var pack = viewModel.Packages()[i];
pack.packageClass = ko.computed(function() {
return this.Height() * this.Depth() * this.Width()
}, pack);
}
绑定页面。
ko.applyBindings(viewModel);
Page在这种状态下工作正常......
但是现在用户想要“保存”和“重新加载”页面。 这将使用映射功能完成,该功能使用新数据更新ViewModel。
data = ko.mapping.toJSON(viewModel);
但是在重新绑定页面之前无法再次添加这些计算字段。我将得到错误,找不到计算元素(
)ko.mapping.fromJS(data, viewModel);
我做错了什么?
没有计算字段或没有重新加载ViewModel ...
,一切正常更新:小提琴已更新为像解决方案一样工作。
答案 0 :(得分:1)
创建一个显式的ViewModel
PackageViewModel = function(data) {
ko.mapping.fromJS(data, {}, this);
this.packageClass = ko.computed(function() {
return this.Height() * this.Depth() * this.Width()
}, this);
};
然后使用像这样的映射选项
var mapping = {
Packages: {
create: function(options) {
return new PackageViewModel(options.data);
}
}
};
ko.applyBindings(ko.mapping.fromJS(data, mapping));