我发现了代码的问题。ko.toJS
保留对象中的函数,以便能够很好地映射它。然而,jquery 将调用数据对象上的所有函数来尝试获取值。这反过来又导致无限循环。
您需要标记Save
函数不被映射。不幸的是toJS
函数似乎无法做到这一点。它将保留对象的所有成员。幸运的是,映射插件允许您做到这一点。
要排除成员,请设置ignore
包含数组的选项'Save'
它会忽略Save
映射时的成员。
var data = ko.mapping.toJS(self, {
ignore: ['Save']
});
如果您不使用映射插件,您始终可以选择删除Save
来自 JS 对象的函数。
self.Save = function () {
$.ajax({
type: "POST",
url: "/contact",
data: self.ToData(),
success: state.OnSaved
});
};
self.ToData = function () {
var data = ko.toJS(self);
delete data.Save; // remove functions
delete data.ToData;
return data;
};
另一方面,我建议不要尝试使用视图模型实例作为调用的数据。我会显式创建数据对象。当然,它有可能会很长,但这是一种很可能永远有效的方法。
self.ToData = function () {
return ko.toJS({
Name: self.Name,
Address: self.Address,
City: self.City,
State: self.State,
PostalCode: self.PostalCode
});
};