0

ビューモデルのバインドに MVC 4Application でノックアウトを使用しています。ビュー モデル全体をリロードせずに、Ajax 成功関数のビュー モデル フィールドを更新する必要があります。次のコードを使用して、ビュー モデル フィールドを更新しています。しかし、問題は、各ビューモデルフィールド値の更新時に、ビューモデル全体がリロードされ、updateHiddenElements メソッドを呼び出すという循環要求になることです。

ここに私のビューモデルがあります

function ViewModel(data) {

      var self = this;
      self.Fields = ko.observableArray(ko.utils.arrayMap(data, function(item) {
        return new FormField(item);
      }));
      self.HiddenElements = ko.observableArray([]);
      self.dirtyFlag = new ko.dirtyFlag(self, false);
      self.applyUpdates = ko.computed(function () {

      if (self.dirtyFlag.isDirty()) {
          //alert("YES !!!");
           updateHiddenElements(self);
           setTimeout(function() {
           self.dirtyFlag.reset();
           }, 0);
       }
     });
};

これが私の更新方法です。

var updateHiddenElements = function (viewModel) {
 //alert("Posting Data:\n\n"+ko.toJSON(viewModel));
 //console.log("#### SENDING AJAX REQUEST TO FETCH LIST OF ELEMENTS TO BLANKOUT ####\n");
   $.ajax({
             type: "POST",
             url: '@Url.Action("GetBlankoutElements", "Offer")' +  "?OfferID=" + @Model.ID,
             contentType: 'application/json; charset=utf-8',
             dataType: 'json',
             data: ko.toJSON(viewModel),
             success: function(result) {
               result.split(',').forEach(function(name) {
               var param = ko.utils.arrayFirst(viewModel.Fields(),  function(currentParam)
               {
                    return currentParam.Name() == name;
               });
               if (param) {
                            param.Value(param.Default());
                           }
              });
              viewModel.HiddenElements(result.split(','));
             }
          });
 };

この問題を解決する方法を教えてもらえますか?

4

1 に答える 1

0

ビューモデル全体を完全にリロードする方法がわかりません。しかし、updateHiddenElements 関数がビューモデル内に直接実装されていない理由がわかりません。これは私にははるかに論理的に思え、問題を解決できると思います。「成功」関数はビューモデルで直接機能するよりも機能し、ビューモデル全体を渡す必要はありません。

function ViewModel(data) {
    ...
    updateHiddenElements = function () {
         $.ajax({
           type: "POST",
           url: '@Url.Action("GetBlankoutElements", "Offer")' +  "?OfferID=" + @Model.ID,
           contentType: 'application/json; charset=utf-8',
           dataType: 'json',
           data: ko.toJSON(self),
           success: function(result) {
             result.split(',').forEach(function(name) {
             var param = ko.utils.arrayFirst(self.Fields(),  function(currentParam)
                           self.HiddenElements(result.split(','));
             }
             ...
           });
       });
}
于 2013-04-19T09:06:51.597 に答える