Вопрос
Предназначен ли Angular для постоянной повторной проверки всего, чтобы обнаружить изменения?Я из мира React, и я ожидал чего-то вроде event triggered -> re-rendering
.Я не знаю, если это что-то из моего приложения или что-то из Angular.
Если у меня есть метод, который вызывается из шаблона HTML, он вызывается бесконечно, даже если ничего в моемизменения компонентов.
Проблема
У меня есть страница, похожая на календарь, которая загружает много данных и должна что-то вычислять перед рендерингом,потому что это было бы слишком сложно сделать с директивой ngIf
.Поэтому в моем шаблоне есть вещи, которые выглядят следующим образом:
<div [innerHTML]="_getDayPrice(item, day) | safeHtml"></div>
Если я что-то консолью регистрирую в методе _getDayPrice
, печатается бесконечно .
То, что я пробовал
Мне удалось обойти это, вручную вставив ChangeDetectionRef
в мое приложение и выполнив this.cdRef.detach()
.Это, однако, кажется хакерским, так как иногда мне может понадобиться снова включить его и отключить снова.
Я пытался выяснить, является ли это чем-то из моих приложений родительских компонентов, таких как контейнеры.Я создал в моем главном app.component один элемент div, такой как <div class={{computeClass()}}>
, и в этом методе напечатал консольный журнал и, конечно, он вызывается бесконечно.После этого я попытался закомментировать все сервисы приложений.Если все закомментированы достаточно точно, это работает правильно, но также нет никаких наблюдаемых данных.Я исследовал около полдня и не смог найти ни одной точки отказа (например, комментирование этого сервиса исправляет все).
Запись производительности с помощью встроенной вкладки «Производительность» Chrome, но опять не смог найти ничего из моего кода, который вызывает изменения.zone.js
вызывается несколько раз и, кажется, устанавливает интервал, который продолжает срабатывать.
Конечно, я искал случаи setTimeout
и setInterval
в службах, но не смогне могу найти что-то, что постоянно меняется, что может вызвать эту проблему.
Заключение?
Итог: нормально ли это, если у вас естьсложное приложение Angular и вызов метода из шаблона, чтобы этот метод вызывался бесконечно?
А если нет, есть ли у вас какие-либо подсказки относительно того, что может быть причиной этого?Или каким-либо другим способом обойти это, а не отключать детектор changeRef?
Моя единственная проблема - производительность.Это похожая на календарь страница, отображающая несколько строк, и она довольно сильно отстает на ноутбуке с 8 ГБ ОЗУ.Я почти уверен, что планшет или телефон почти замерзнут.