2013-04-19 3 views
0

J'utilise knockout dans mon application MVC 4Application pour voir la liaison de modèle. J'ai besoin de mettre à jour mes champs de modèle de vue sur la fonction de succès Ajax sans recharger le modèle de vue entière. J'utilise le code suivant pour mettre à jour les champs de modèle de vue. Mais le problème est que lors de la mise à jour de chaque valeur de modèle de vue, le mode viewmodel entier est rechargé, ce qui aboutit à une requête circulaire d'appel de la méthode updateHiddenElements.mise à jour knockout observable sur la fonction de succès ajax sans recharger

Voici mon modèle Voir

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); 
     } 
    }); 
}; 

Voici ma méthode de mise à jour,

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(',')); 
      } 
      }); 
}; 

Quelqu'un peut-il me suggère comment résoudre ce problème?

Répondre

0

Je ne vois pas comment tout le viewmodel peut être complètement rechargé. Mais je ne comprends pas pourquoi la fonction updateHiddenElements n'est pas implémentée directement dans le viewmodel. Cela me semblerait beaucoup plus logique et je pense que cela pourrait éclaircir vos problèmes. Les fonctions 'succès' ne fonctionnent que directement sur le viewmodel et vous n'avez pas besoin de passer tout le viewmodel.

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(',')); 
      } 
      ... 
      }); 
     }); 
} 
Questions connexes