0

ノックアウトマッピングを使用して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 に答える