挖空.js映射导致 IE9 上的无限递归
knockout.js mapping causing infinite recursion on IE9
我通过我的淘汰.js映射在IE上进行了无休止的递归。更熟悉KO的人可以发现我做错了什么吗?
我有以下淘汰.js映射:
var mapping = {
create: function(options) {
return new MyViewModel(options.data);
},
'ChildItems': {
create: function(options) {
return new ChildVM(options.data);
}
}
}
当我渲染页面大约 1 次中的 5 次时,IE 最终会出现以下无限递归堆栈(导致"SCRIPT28:堆栈空间不足")。IE的调用堆栈:
fromJS
MyViewModel
create
Anonymous Function
withProxyDependentObservable
createCallback
updateViewModel
fromJS
MyViewModel
create
Anonymous Function
withProxyDependentObservable
createCallback
updateViewModel
...
我的视图模型构造函数:
function MyViewModel(data) {
var self = this;
this.$type = 'MyViewModel';
[some observables]
...
ko.mapping.fromJS(data, mapping, this);
}
视图模型的初始化是通过调用 json 端点来完成的:
$.ajax({
url: 'http://my.end/point',
type: 'POST',
data: JSON.stringify(payload),
contentType: 'application/json; charset=utf-8',
success: function(data) {
window.vm = ko.mapping.fromJS(data, mapping);
ko.applyBindings(window.vm)
}
});
您应该将映射对象划分为 2 个对象。首先用于映射视图模型,第二次用于子项。
var mapping = {
create: function(options) {
return new MyViewModel(options.data);
}
}
var childrenMapping = {
'ChildItems': {
create: function(options) {
return new ChildVM(options.data);
}
}
}
您的 ajax 请求保持不变。更新 MyViewModel 函数以使用子项映射:
function MyViewModel(data) {
var self = this;
this.$type = 'MyViewModel';
[some observables]
...
ko.mapping.fromJS(data, childrenMapping, this);
}
问题的根本原因是映射的递归调用。当您调用ko.mapping.fromJS(data, mapping);
淘汰调用时,创建规则,其中创建 MyViewModel 对象。在 MyViewModel 的构造函数中,由于使用相同的映射选项,您调用ko.mapping.fromJS
挖空调用相同的创建规则,该规则创建 MyViewModel 对象,其中使用相同的选项调用ko.mapping.fromJS
。
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- JavaScript 素数搜索无限递归
- 挖空.js映射导致 IE9 上的无限递归
- 不使用递归创建jquery无限动画
- 检测无限递归
- Javascript窗口树递归和无限对象
- AngularJS和ui视图导致无限递归
- 无限循环与递归javascript函数
- Javascript中产生无限循环的递归函数
- jQuery无限递归当字符串调用DOM上添加的元素上的插件时
- 在node.js中,全局变量的值在堆栈被无限递归超越后神秘地重置
- Javascript递归承诺陷入无限循环
- Java脚本递归地添加子节点以无限循环结束
- 没有无限循环地递归成对象
- JavaScript快速排序中的无限递归
- 为什么这些符号链接会发生无限递归循环
- (为什么)有一个“自称”的指令在一个有限的n -repeat导致一个堆栈溢出从无限递归