2015-12-02 1 views
10

Я изо всех сил стараюсь выполнять большие таблицы данных с помощью Aurelia.Эффективное отображение больших таблиц данных с помощью Aurelia

Даже в случае таблиц с умеренным размером (20x20) я не получаю ниже 200 мс для Chrome, MS Edge занимает ~ 800 мс, а IE11 занимает ~ 2 с. 200 мс тоже проблема, если вы хотите добавить (виртуальную) прокрутку. Время обработки увеличивается с количеством привязок к ячейке таблицы. Я собрал (example), который связывает «css», «class» и, конечно, содержимое ячейки.

<table class="table"> 
    <tbody> 
    <tr repeat.for="row of rows"> 
     <td repeat.for="column of columns" css.bind="getCellStyle(column, $parent.$first)" class.bind="getCellClasses(column, row)"> 
     <template replaceable part="cell-template"> 
      <span>${getCellText(column, row)}</span> 
     </template> 
     </td> 
    </tr> 
    </tbody> 
</table> 

Любые идеи о том, как улучшить производительность?

Основываясь на первоначальных предложениях, я попытался избежать вложенных повторов, но это невозможно в моем случае, поскольку оба столбца и строки являются динамическими.

+0

[ui-virtualization] (http://aurelia.io/ui-virtualization)? –

+0

Вопрос был о оптимизации для визуализации видимых ячеек таблицы. Aurelia ui-virtualization помогает, если есть много невидимых строк. – reinholdk

+0

ohhhhhhhhhhh ... –

ответ

9

Большой вопрос, это то, с чем мы в последнее время были сосредоточены в основном.

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

Во-вторых, используйте по возможности одноразовые привязки. Это устранит любые изъятия из памяти объектов и массива.

<table class="table"> 
    <tbody> 
    <tr repeat.for="row of rows & oneTime"> 
     <td repeat.for="column of columns & oneTime" css.one-time="getCellStyle(column, $parent.$first)" class.one-time="getCellClasses(column, row)"> 
     <span>${getCellText(column, row) & oneTime}</span> 
     </td> 
    </tr> 
    </tbody> 
</table> 

12/13/2015 EDIT

Предстоящий релиз имеет два изменения, которые будут сократить время рендеринга больших сеток пополам или даже меньше. Одно из изменений повышает эффективность односторонних привязок (на сегодняшний день наиболее часто используемый режим привязки), а другой откладывает работу по привязке до тех пор, пока не будет выполнен первоначальный рендеринг. Это будет сделано с использованием oneTime и oneWay так же быстро, как и исходный рендер. Более подробная информация об этих улучшениях здесь: http://blog.durandal.io/2015/12/04/aurelia-repaint-performance-rules/

Демо здесь: http://jdanyow.github.io/aurelia-dbmonster/

+0

Спасибо, перейдя к изменению. Однако, используя oneTime, таблица больше не будет перерисовываться при изменении набора данных (столбцов). Как вызвать перерисовку представления? Просто прочитайте о привязке к сигналу в своем большом блоге: http://www.danyow.net/aurelia-binding-behaviors/, который может помочь здесь, но сигнал, похоже, не приносит пользы от упомянутого выше исправления производительности. – reinholdk

+0

whoa, где это «& oneTime» документировано в выражении повторения? Довольно изящный. –

-2

Просто объединить массивы в один, как упоминался.

+2

Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - [Из обзора] (/ review/low-quality-posts/10428922) –

+0

@MikeB Im довольно уверен, что он напрямую отвечает на его вопрос. он буквально говорит ему, что делать. –

+0

благодарит за отзыв, но я чувствую, что предоставленный ответ не соответствует рекомендациям, упомянутым здесь: http://stackoverflow.com/help/how-to-answer –