2013-05-03 63 views
0

在我的Knockout視圖模型中,我有一個發送jQuery POST請求的Save()函數。在這個POST請求內部是對ko.toJS(this)的調用。Knockoutjs - 視圖模型內部導致不良遞歸的函數

每當我調用Save函數,瀏覽器就會變得無法響應,最終告訴我遞歸太多了。在調試時(通過使用斷點),我發現當我調用toJS()時,它似乎在某種程度上克隆了對象,並且在克隆時調用了Save()函數,該函數依次調用JS()。 ..還有遞歸。

爲什麼會發生這種情況,有沒有辦法避免它,而不使用toJSON()?

[我有一個關於其他的toJSON問題,這也解釋了爲什麼我不希望使用它。]

爲了完整起見,這裏是我的視圖模型。

function vmDictionary(dict) { 

    if (dict === null || dict === undefined) { 
     return; 
    } 

    var self = this; 

    // directly-assigned variables 
    self.Concepts = new vmConcepts(dict.Concepts); 
    self.Deleted = ko.observable(dict.Deleted); 
    self.Description = ko.observable(dict.Description); 
    self.IncludeInSearch = ko.observable(true); 
    self.ID = ko.observable(dict.ID); 
    self.Languages = ko.observableArray(dict.Languages); 
    self.LastUpdate = new vmChangeRecord(dict.LastUpdate); 
    self.Name = ko.observable(dict.Name); 
    self.Public = ko.observable(dict.Public); 

    self.TemplateName = function(observable, bindingContext) { 
     return "dictionary-template"; 
    }; 

    // computed variables 
    self.PublicText = ko.computed(function() { 
     return sp.Utils.Localize(self.Public 
      ? "Public" 
      : "Private"); 
    }); 

    // exposed functions 
    self.Save = function() { 
     $.ajax({ 
      data: ko.toJSON(self), 
      dataType: "json", 
      type: "POST", 
      url: [...], 
      statusCode: { 
       200: function (response) { 
        console.log(response); 
       } 
      }, 
      error: function (xmlHttpRequest, textStatus, errorThrown) { 
       console.log(xmlHttpRequest); 
       console.log(textStatus); 
       console.log(errorThrown); 
      } 
     }); 
    }; 
} 

UPDATE:加入整個視圖模型(上文)。

+0

您當前的代碼仍然有效。但是因爲某些部分缺少像'vmChangeRecord'和'vmConcepts'和'sp.Utils.Localize'。很難分辨出導致遞歸的原因。我會逐行評論屬性/函數/等。看哪一個是引起遞歸的。 – nemesv 2013-05-03 11:01:00

回答

0

你一定做錯了什麼,工作在一點點搗鼓我

http://jsfiddle.net/brN9s/

ViewModel = function() { 
    this.someData = ko.observable("Test"); 
    this.dto = ko.observable(); 
}; 

ViewModel.prototype = { 
    Save: function() { 
     this.dto(ko.toJS(this));   
    } 
}; 

var viewModel = new ViewModel(); 
ko.applyBindings(viewModel); 
viewModel.Save(); 
+0

看起來你是對的。那麼,我的視圖模型會出現什麼問題呢? (我已經更新了問題以包含整個視圖模型。) – awj 2013-05-03 09:16:24