Превышен максимальный размер стека вызовов при привязке результатов Breeze к диаграммам пользовательского интерфейса Kendo

Я работаю над модифицированной версией шаблона Hot Towel для создания Angular SPA. Я использую Breeze для доступа к своим службам данных с пользовательским интерфейсом кендо и визуализацией данных для виджетов и диаграмм.

Я столкнулся с проблемой, аналогичной указанной в этом сообщении SO Chrome/ /kendoUI/jQuery: превышен максимальный размер стека вызовов. При привязке вывода моей службы breeze непосредственно к диаграмме я получаю сообщение Максимальный размер стека вызовов превышен на клиенте с сообщением «Неперехваченная ошибка: [$rootScope:infdig] 10 итераций $digest() достиг. Aborting!Watchers запущены за последние 5 итераций: []'

Результаты Breeze имеют циклические ссылки, на что также указывает приведенная выше ссылка. У меня нет проблем с привязкой этого к обычным переменным области видимости angular, но ошибка возникает только при привязке этого к моим диаграммам. Фильтрация данных на клиенте, как предполагает ссылка, вероятно, повлияет на производительность. Я попробовал пару функций-заменителей и JSON.prune, но они также удаляют данные, которые мне нужно отображать на графиках :(

Есть ли другое решение для этого?

Полная ошибка вставлена ​​ниже. Похоже, что для каждого свойства выполняется глубокая копия, но поскольку есть циклические ссылки, это приводит к ошибке переполнения.

RangeError: Maximum call stack size exceeded
    at Object.toString (native)
    at isArray (http://localhost:61438/Scripts/angular.js:596:19)
    at isArrayLike (http://localhost:61438/Scripts/angular.js:278:27)
    at forEach (http://localhost:61438/Scripts/angular.js:324:16)
    at copy (http://localhost:61438/Scripts/angular.js:871:7)
    at copy (http://localhost:61438/Scripts/angular.js:858:23)
    at copy (http://localhost:61438/Scripts/angular.js:875:28)
    at copy (http://localhost:61438/Scripts/angular.js:858:23)
    at copy (http://localhost:61438/Scripts/angular.js:875:28)
    at copy (http://localhost:61438/Scripts/angular.js:858:23) angular.js:9778
(anonymous function) angular.js:9778
(anonymous function) angular.js:7216
Scope.$digest angular.js:12270
(anonymous function) angular.js:12450
completeOutstandingRequest angular.js:4300
(anonymous function)

Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.2.16/$rootScope/infdig?p0=10&p1=%5B%5D angular.js:78
(anonymous function) angular.js:78
Scope.$digest angular.js:12290
(anonymous function) angular.js:12450
completeOutstandingRequest angular.js:4300
(anonymous function)

person chirag kalyanpur    schedule 11.07.2014    source источник
comment
Наконец-то мне удалось решить эту проблему. Я использовала cycle.js и немного изменила его метод дециклирования, т. е. мне пришлось создать поверхностную копию каждого свойства, чтобы отделить _backingStore от объекта. Кроме того, _backingStore и entityAspect назначены нулевыми (поскольку код работает в строгом режиме). Благодаря этим двум изменениям я могу напрямую связать результат бриза с элементами управления кендо с минимальной потерей данных. Не уверен, насколько это эффективно, когда дело доходит до редактируемого элемента управления. Любые входные данные по этому поводу будут полезны.   -  person chirag kalyanpur    schedule 22.07.2014


Ответы (1)


Это происходит из-за того, что сущности Breeze имеют ссылки друг на друга, и большинство сеток поставщиков не останавливают повторение свойств при привязке. Исправление для этого использует проекцию, как описано здесь -

http://www.breezejs.com/documentation/knockout-circular-references

person PW Kad    schedule 12.07.2014
comment
Спасибо, Кад, это исправление, которое мы в настоящее время внесли, чтобы заставить его работать, не знал, что это было задокументировано на веб-сайте бриза. Спасибо, что указали это. Хотел проверить, есть ли другой доступный вариант - person chirag kalyanpur; 14.07.2014