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 回答