Итак, я сделал некоторую пользовательскую директиву, которая рисует своего рода сетку данных на основе плавающих div (потому что вложенная реализация flex в FF отстой, но это не главное).
Как это устроено :
Я передаю некоторые данные в директиву через что-то вроде
<the-grid data-list="parentController.displayedRows">
Внутри этой первой директивы у меня есть столбцы через что-то вроде
<a-grid-column data-value="row.value"></a-grid-column>
со многими атрибутами, которые я не буду здесь уточнять.Значение
data-value
может быть прямым выражением, привязанным к строке, в которой контроллер директивыthe-grid
повторяет ng для отображения каждого столбца, или функцией, которую необходимо вычислить, чтобы отобразить предполагаемое значение изparentController
.В моем контроллере директивы
<the-grid>
у меня есть шаблон рендеринга моей сетки, который создает вложенный div ng-repeat (первый в строках сбора данных, второй в столбцах, созданных в директиве), это выглядит так:<div data-ng-repeat="row in list"> <div data-ng-repeat="cell in theGridColumns" data-ng-bind-html="renderCell(row, cell)"> </div> </div>
У меня есть некоторая клавиатурная навигация, чтобы быстро выбрать строку или перемещаться по нумерации страниц или многим вкладкам, что делает не что иное, как применение некоторого класса к выбранной строке, в дополнение к обновлению некоторого «selectedRowIndex».
Я использую angular-vs-repeat, чтобы иметь минимум разделов строк в мой DOM (поскольку приложение работает на медленных компьютерах). Это хорошо работает.
Проблема в том, что каждый раз, когда я нажимаю клавишу «вверх» или «вниз» на клавиатуре, Angular «перерисовывает» КАЖДЫЕ ячейки списка.
Итак, предположим, у меня есть 200 строк в моем списке данных и 7 столбцов для каждой строки. Первая загрузка страницы, она проходит ~3000 раз в функции renderCell()
. Хорошо, давайте примем это (не совсем понимаю, почему, но ладно).
Я нажал клавишу «вниз», чтобы перейти ко второй строке моего списка. Он проходит ~1100 раз в функции renderCell()
.
Так что да, результат очень медленный (представьте, если я нажму клавишу со стрелкой вниз, чтобы быстро перемещаться по своим строкам)... Я не могу этого принять. Если бы кто-нибудь мог объяснить это мне... Любая помощь будет принята с благодарностью :)
Если я делаю то же самое без директивы (прямая манипуляция DOM, со столбцами, сделанными вручную, а не в ng-repeat внутри ng-repeat), все будет гладко и чисто.
Да, я изучил каждую угловую сетку, представленную на рынке. Никто не удовлетворяет меня для моей цели, поэтому я решил создать свою собственную.
И нет, на данный момент я действительно не могу дать вам JSFiddle или что-то в этом роде. Все приложение действительно щупальце, изолировать его довольно сложно).