Knockout映射+计算子元素+“映射重载”失败

时间:2012-11-29 21:01:11

标签: knockout.js knockout-mapping-plugin

我希望使用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 ...

,一切正常

更新:小提琴已更新为像解决方案一样工作。

Fiddle sample

1 个答案:

答案 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));