我们的许多用户仍在使用 IE8。他们中的一些人在尝试将数据发布到我们的服务器时偶尔会报告问题(通过标有“保存”的大按钮)。
IE8显示有一个脚本错误,即:Unexpected call to method or property access,始终指向KnockoutJS 2.2.0 (debug, for now)库中的同一行,第450行,如下:
return JSON.stringify(ko.utils.unwrapObservable(data), replacer, space);
我的代码中发生这种情况的堆栈跟踪根的方法是:
self.saveSingle = function (onSuccess, onFailure) {
ko.utils.arrayForEach(self.days(), function (day) {
day.close();
});
var jsonData = ko.toJSON(self);
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: applicationLocation + "/api/assignmentapi/save",
data: jsonData,
success: function (data) {
self.status(data.Status);
self._isDirty(false);
ko.utils.arrayForEach(self.days(), function (day) {
day.clean();
});
if (onSuccess)
onSuccess();
},
error: function (data) {
onFailure();
},
dataType: "json"
});
};
当我们使用这种方法将对象转换为 JSON 时,我们确实去除了一些 POST 不需要的属性:http ://www.knockmeout.net/2011/04/controlling-how-object-is-converted -to.html
OurType.prototype.toJSON = function () {
var copy = ko.toJS(this);
delete copy.someUnneededProperty1;
delete copy.someUnneededProperty2;
delete copy.someUnneededProperty3;
delete copy.someUnneededProperty4;
return copy;
}
当它失败时,它始终在线上失败
var jsonData = ko.toJSON(self);
现在真正的混乱来了:
- 它并非始终如一地发生
- 并非所有 IE8 用户都会发生这种情况
- 我们无法始终如一地重现它
- 我们正在序列化的模型的结构似乎并不重要
- jscript.dll 是 IE8 的当前版本