在我的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:加入整個視圖模型(上文)。
您當前的代碼仍然有效。但是因爲某些部分缺少像'vmChangeRecord'和'vmConcepts'和'sp.Utils.Localize'。很難分辨出導致遞歸的原因。我會逐行評論屬性/函數/等。看哪一個是引起遞歸的。 – nemesv 2013-05-03 11:01:00