0

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

页面在这种状态下工作正常......

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

data = ko.mapping.toJSON(viewModel);

但是在重新绑定页面之前不可能再次添加那些计算字段。而且我会得到错误,即找不到计算元素(不再)。

ko.mapping.fromJS(data, viewModel);

我做错了什么吗?

没有计算字段或没有重新加载 ViewModel 一切正常...

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

小提琴样本

4

1 回答 1

1

创建显式 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));
于 2012-11-29T21:24:18.147 回答