В моей модели представления с нокаутом у меня есть функция Save(), которая отправляет запрос POST JQuery. Внутри этого запроса POST есть вызов ko.toJS(this)
.Knockoutjs - функция внутри viewmodel, вызывающая нежелательную рекурсию
Всякий раз, когда я вызываю эту функцию сохранения, браузер становится невосприимчивым и в конце концов говорит мне, что слишком много рекурсии. После отладки (с помощью точек останова) я обнаружил, что при вызове метода 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);
}
});
};
}
ОБНОВЛЕНИЕ: добавили всю модель представления (выше).
Ваш текущий код по-прежнему работает. Но поскольку некоторые части отсутствуют, например, 'vmChangeRecord' и' vmConcepts' и 'sp.Utils.Localize'. трудно сказать, что вызывает рекурсию. Я бы прокомментировал строки за строкой свойства/функции/и т. Д. чтобы узнать, какая из них вызывает рекурсию. – nemesv