0

ページの読み込み時に、JSONデータをこのようなビューモデルに変換しています

var jsonField = '#' + '<% = hdnField.ClientID  %>';

                    jsonModel= {
                       availables: ko.observableArray([])
                   };

                 
                   var valueField = $(jsonField)[0].value;
                   var arrayGroup = $.parseJSON(valueField);

                   jsonModel.availables = ko.viewmodel.fromModel(arrayGroup);
                  
                  var block=$('#availabilitiesBlock')[0];
                   ko.applyBindings(jsonModel,block);

ページが読み込まれた後、このビュー モデルを更新するために ajax サーバー関数を呼び出しています。

tha ajaxサクセスコールバックでは、私は次のように書いています

 var updatedModel = {
                availables: ko.observableArray([])

            };
            updatedModel.availables = ko.viewmodel.fromModel(data.d);

この更新されたモデルでビュー モデルを更新しようとすると、モデル全体が空白になります

私は次の方法を試しました

  1. data.d を oldModel.availables オブザーバブルにプッシュしました。データをプッシュすると、配列オブジェクトはオブザーバブルとして変換されませんが、アイテムは availables 配列に追加されました。最初 (ページの読み込み中) では、オブジェクトは問題なく変換されました。

  2. ビューモデルを直接更新しようとしましたが、この場合、モデル全体が空白になります

    ko.viewmodel.updateFromModel(oldModel, updatedModel);

古いモデルの切り取り

古いモデル

更新されたモデルの抜粋

更新されたモデル

私が言ったように、配列オブジェクトを直接プッシュしたとき (data.d)、オブザーバブルは ajax の前の最初のケースのように自動的に作成されません。

ロジックが同じであるのに、なぜこれが起こっているのですか? オブジェクトを自動的にマッピングするためにhttp://coderenaissance.github.io/knockout.viewmodel/を使用しています。

どんなポインタも役に立ちます

4

1 に答える 1

3

Rohith、ここでの答えは、ajax 呼び出しから何を返すかによって異なります。

updateModel を作成する代わりに、必要な ajax 呼び出しからのリターンを信じています

ko.viewModel.updateModel(jsonModel.availables, data.d);

Ajax 呼び出しから返された data.d が特別なマッピングを必要としない場合 (つまり、オブザーバブルを必要としない単なるオブジェクトの配列である場合)、単純にモデルを直接更新できます。

//ko.viewModel.updateModel(jsonModel.availables, data.d);
jsonModel.availables(data.d);

あなたが直面している根本的な問題は、ビューがバインドされているオブザーバブルを失っていることです。jsonModel.availables を上書きするか、無視して別のモデル (この場合は updateModel) を更新すると、失われます。

私は、AJAX を使用する際のこの正確な問題についてのブログ投稿に取り組んでいますが、この投稿の 3 番目のセクションで、発生している問題の一部を見ることができます: http://ryanrahlf.com/getting-started-with -knockout-js-3-things-to-know-on-day-one/

これが役立つことを願っています!

于 2013-07-09T15:21:57.007 に答える