Chrome//kendoUI/jQuery: превышен максимальный размер стека вызовов

Я работаю с шаблоном hottowell для создания спа-приложения и получаю приятную ошибку от 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.web.js из библиотеки kendo ui):

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.

Я получаю много исключений из строки 4224 файла jquery-1.9.1.js

div.querySelectorAll("*,:x");

и строка 4242 файла jquery-1.9.1.js

matches.call( div, "[s!='']:x" );

Эти исключения вызывают ошибку в консоли:"Превышен максимальный размер стека вызовов"

Я подозреваю, что мое представление HTML, возможно, какой-то элемент HTML вызывает эту проблему. Другой интересный комментарий заключается в том, что проблема возникает, когда элемент внутри html-представления изменяется с visible:false на visible:true (на мой взгляд, это html-таблица, которая может показать или скрыть детали для выбранной строки).

1 ответ

Какой объект данных вы пытаетесь связать? Ошибка "Превышен стек вызовов" часто возникает при привязке компонента пользовательского интерфейса Kendo к объекту данных, который имеет циклические ссылки (например, customer -> orders[0] -> customer). Все объекты Breeze имеют циклические ссылки (например, customer.entityAspect.entity, который указывает на клиента).

Поэтому вам нужно либо обучить компонент игнорировать определенные пути, либо вставить промежуточный объект, который обрезает эти пути. Если вы просто представляете (не обновляете) объект, вы можете сделать безопасную копию с помощью JSON.stringify, передав функцию замещения, чтобы исключить круговые пути.

Это большая тема, чем у меня есть время в этом ответе. Спешу добавить, что это не единственный пользовательский интерфейс Kendo с этой проблемой.

Другие вопросы по тегам