Chrome // kendoUI / jQuery:超出最大调用堆栈大小

时间:2013-07-31 03:09:57

标签: jquery kendo-ui breeze durandal hottowel

我正在使用hottowell模板创建spa应用程序,我从jquery得到一个很好的错误。基本上我的问题现在开始尝试绑定我的视图 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视图,也许是一些html元素引发了这个问题。其他有趣的评论是当html视图中的元素从visible:false变为visible:true时出现问题(我的视图是一个html表,它能够显示或隐藏所选行的详细信息)

1 个答案:

答案 0 :(得分:5)

您想要绑定哪个数据对象?将Kendo UI组件绑定到具有循环引用的数据对象(例如,customer - &gt; orders [0] - &gt; customer)时,通常会发生“调用堆栈超出”错误。所有breeze实体都有循环引用(例如,customer.entityAspect.entity指向客户)。

因此,您需要训练组件以忽略某些路径或插入剪切这些路径的中间对象。如果您只是呈现(不更新)对象,您可以使用JSON.stringify制作一个安全副本,传入一个替换器函数来排除循环路径。

这是一个比我在这个答案中有时间的话题。 Kendo UI并不是唯一一个有这个问题的人,我赶紧补充一下。