Обновление
Вы видите, что это называется умножением времени, потому что Angular оценивает все выражения, которые вы используете в своем шаблоне в каждом цикле обнаружения изменений. Цикл обнаружения изменений начинается с метода ApplicationRef.tick .
Когда приложение запускается, вызывает этот тиковый метод немедленно, а затем оно управляется ngZone.onMicrotaskEmpty подпиской.
Дополнительно, каждый тиковый метод выполняет дополнительную проверку checkNoChanges для режима разработки.
Итак, вы получаете
App starts
loadComponent
tick
checkChanges
evaluate getArray()
checkNoChanges
evaluate getArray()
ngZone.onMicrotaskEmpty
subscribe(all promised have been executed)
tick
checkChanges
evaluate getArray()
checkNoChanges
evaluate getArray()
...some time later
subscribe(you click somewhere)
tick
checkChanges
evaluate getArray()
checkNoChanges
evaluate getArray()
subscribe(you make a http request)
tick
checkChanges
evaluate getArray()
checkNoChanges
evaluate getArray()
Предыдущий ответ
Вам следует избегать использования в шаблоне Angular выражений, которые выполняют сложные вычисления, выполняют побочный эффект или возвращают новое значение при каждом запуске обнаружения изменений.
Особенно в вашем коде
<h1 *ngFor="let item of getArray()">
вы возвращаете новый массив при каждой проверке шаблона. И директива ngForOf обнаруживает, что вы изменили массив, и пытается перерисовать его (если ваши элементы будут объектами).
Лучше, если вы определите этот массив один раз в своем коде.
arr = ['number one', 'number two']
<h1 *ngFor="let item of arr">
Другим способом, который может работать для директивы ngForOf, является использование trackBy, но для этого лучше иметь некоторый уникальный ключ в элементе.
Смотри также