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

我正在使用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" ); 

这些exception导致控制台中出现错误:“超出最大调用堆栈大小”

我的怀疑是我的html视图,也许是一些html元素引发了这个问题。 其他有趣的评论是当html视图中的元素从visible:false变为visible:true时出现问题(我的视图是一个html表,它能够显示或隐藏所选行的详细信息)

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

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

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