Serialization Knockoutjs-viewmodel内的函数,导致不需要的递归
在我的Knockout视图模型中,我有一个Save()函数,它发送jQuery POST请求。在这个POST请求中调用了Serialization Knockoutjs-viewmodel内的函数,导致不需要的递归,serialization,recursion,knockout.js,Serialization,Recursion,Knockout.js,在我的Knockout视图模型中,我有一个Save()函数,它发送jQuery POST请求。在这个POST请求中调用了ko.toJS(this) 每当我调用这个Save函数时,浏览器就会变得无响应,并最终告诉我递归太多。在调试时(通过使用断点),我发现当我调用toJS()时,它似乎对对象进行了某种程度的克隆,在进行克隆时,它调用了Save()函数,而Save()函数反过来又调用toJS()。。。这就是递归 为什么会发生这种情况,有没有一种不使用toJSON()就能避免这种情况的方法 [我还有一
ko.toJS(this)
每当我调用这个Save函数时,浏览器就会变得无响应,并最终告诉我递归太多。在调试时(通过使用断点),我发现当我调用toJS()时,它似乎对对象进行了某种程度的克隆,在进行克隆时,它调用了Save()函数,而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);
}
});
};
}
更新:添加了整个视图模型(如上)。你一定做错了什么,对我来说有点麻烦
看来你是对的。那么,我的视图模型会有什么问题呢?(我已经更新了问题以包括整个视图模型。)您当前的代码仍然有效。但是因为缺少了一些部分,比如
vmchangecord
和vmConcepts
和sp.Utils.Localize
。很难说是什么导致了递归。我会逐行注释掉属性/函数等,看看是哪一个导致了递归。。。。
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();