在我的 Knockout 视图模型中,我有一个发送 jQuery POST 请求的 Save() 函数。在这个 POST 请求中调用ko.toJS(this)
.
每当我调用此 Save 函数时,浏览器就会变得无响应并最终告诉我递归过多。调试时(通过使用断点),我发现当我调用 toJS() 时,它似乎对对象进行了某种程度的克隆,并且在进行这种克隆时,它调用了 Save() 函数,该函数又调用了 toJS()。 ..还有递归。
为什么会发生这种情况,有没有办法在不使用 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);
}
});
};
}
更新:添加了整个视图模型(上图)。