Knockout.js 敲除映射+;计算子元素+&引用;映射重新加载“;失败

Knockout.js 敲除映射+;计算子元素+&引用;映射重新加载“;失败,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我希望使用敲除映射来生成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

我希望使用敲除映射来生成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);
}
页面在此状态下工作正常

但现在用户希望“保存”和“重新加载”页面。 这将通过使用映射功能完成,映射功能使用新数据更新ViewModel

data = ko.mapping.toJSON(viewModel);
但在重新绑定页面之前,不可能再次添加这些计算字段。我将得到一个错误,即找不到计算元素(不再)

我做错什么了吗?

无需计算字段或重新加载ViewModel,一切都可以正常工作

更新:小提琴已更新,可以像在解决方案中一样工作。


创建一个显式的ViewModel

PackageViewModel = function(data) {
    ko.mapping.fromJS(data, {}, this);

    this.packageClass = ko.computed(function() {
        return this.Height() * this.Depth() * this.Width()
    }, this);
};
然后像这样使用mappign选项

var mapping = {
   Packages: {
      create: function(options) {
         return new PackageViewModel(options.data);
      }
   }
};

ko.applyBindings(ko.mapping.fromJS(data, mapping));

我更新了fiddle以使用最新的淘汰版V2.2.0。然后一切都开始了。
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));