Angular2 ужасная производительность при ngFor присвоении переменной «index»

#angular

#угловатый #angular

Вопрос:

Рассмотрим следующий 2d-массив:

 myLabels = [[45, 56, 63],
            [31, 67, 27],
            [89, 23, 61]]
  

Теперь в шаблоне выполните итерацию по этому массиву следующим образом:

 <template ngFor let-row_ [ngForOf]=myLabels let-i="index">
  <template ngFor let-labelid [ngForOf]=row_ let-j="index">
    ...
  </template>
</template>
  

Когда я увеличиваю свой массив до чего-то большего, производительность падает довольно сильно. Рендеринг массива скромных размеров 40×40 с использованием Chromium 50 занимает почти 40 секунд. В Firefox 47 это немного быстрее, но ненамного.

Если я исключу назначения индексов ( let-i="index"... ), то производительность будет просто отличной

 <template ngFor let-row_ [ngForOf]=myLabels>
  <template ngFor let-labelid [ngForOf]=row_>
    ...
  </template>
</template>
  

Итак, вопрос в том, что можно сделать, чтобы смягчить эту проблему? Есть ли что-то, чего я не понимаю ngFor ? Есть ли другой способ?

Ответ №1:

Вы пытались изменить свою стратегию обнаружения изменений на: ChangeDetectionStrategy.OnPush ?

Также рассмотрите возможность создания неизменяемых массивов.(Смотрите immutable.js )

Проверьте эту статью: http://jvandemo.com/how-i-optimized-minesweeper-using-angular-2-and-immutable-js-to-make-it-insanely-fast/