我正在使用 hottowell 模板来创建 spa 应用程序,并且我从 jquery 中收到了一个很好的错误。基本上我的问题从此刻开始尝试绑定(bind)我的 View viewModelBinder.js(来自 durandal 库)。
viewModelBinder.beforeBind(obj, view);
action();
viewModelBinder.afterBind(obj, view);
此时调用 beforeBind 会执行此代码(我自己的应用程序的 main.js)
kendo.ns = "kendo-";
viewModelBinder.beforeBind = function (obj, view) {
kendo.bind(view, obj.viewModel || obj);
};
其中 kendo.bind 类似于(来自 kendo ui 库的 kendo.web.js):
function bind(dom, object) {
var idx, length, roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));
object = kendo.observable(object);
dom = $(dom);
for (idx = 0, length = dom.length; idx < length; idx++) {
bindElement(dom[idx], object, roles);
}
}
当我运行生产线时从这里
object = kendo.observable(object); // where object it's my viewmodel as far i see in the debuger.
我从文件 jquery-1.9.1.js 的第 4224 行收到很多异常
div.querySelectorAll("*,:x");
和文件 jquery-1.9.1.js 的第 4242 行
matches.call( div, "[s!='']:x" );
这些异常导致控制台中出现错误:“超出最大调用堆栈大小”
我怀疑是我的 html View ,也许某些 html 元素触发了这个问题。其他有趣的评论是,当 html View 内的元素从visible :false 更改为visible:true 时,就会出现问题(我认为它是一个 html 表格,能够显示或隐藏所选行的详细信息)
最佳答案
您要绑定(bind)什么数据对象?将 Kendo UI 组件绑定(bind)到具有循环引用的数据对象(例如,客户 -> 订单[0] -> 客户)时,经常会发生“超出调用堆栈”错误。所有 Breeze 实体都有循环引用(例如,指向客户的 customer.entityAspect.entity)。
因此,您需要训练组件忽略某些路径,或者插入一个剪辑这些路径的中间对象。如果您只是呈现(而不是更新)对象,则可以使用 JSON.stringify 制作安全副本,传入替换函数以排除循环路径。
这是一个更大的话题,我没有时间在这个答案中讨论。 Kendo UI 并不是唯一有这个问题的,我赶紧补充一下。
关于jquery - Chrome//kendoUI/jQuery : Maximum call stack size exceeded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17960926/