ApplicationRef.tick вызывает проблемы в Angular 6.1.6 - PullRequest
0 голосов
/ 20 февраля 2020

ИДК, если кто-то еще испытывал это, или это известная проблема, которая с тех пор была решена в более новых версиях Angular, но я столкнулся с ней сегодня на работе и боролся с ней даже после интенсивного поиска в Google. По случайности это поможет кому-то другому или предоставит ясность в отношении того, почему у меня возникла проблема, вот что произошло.

Я пытаюсь загрузить API Карт Google динамически, так как ключ API настраивается в зависимости от того, приложение работает в среде разработки, тестирования или производства. Большинство маршрутов в приложение показывают только компоненты, которые не используют виджет Google Maps, поэтому нет проблем, но один загружается с виджетом карты и, следовательно, не может отображаться, пока не будет загружен API. Одним из первых шагов при начальной загрузке приложения является загрузка в браузер группы данных в виде «кэша», включая свойства конфигурации и ключ API Карт. В то время как происходит вся эта загрузка, устанавливается флаг * ng, если фактические компоненты приложения из DOM заменены на экран spla sh. Для маршрутов без виджета карты это не важно, но для маршрута с виджетом карты экран spla sh очищался после загрузки кэша, но до загрузки API Карт с использованием ключа API, содержащегося в кэшированные свойства приложения. Неопределенные классы, ошибки и хаос.

Хорошо, достаточно просто решить. URL загрузки для API Карт позволяет вам передавать функцию обратного вызова, которая будет вызвана после завершения загрузки. Напишите функцию внутри службы загрузки кэша (с доступом к флагу и запуском в качестве обратного вызова после загрузки ключа API) и объявите функцию обратного вызова для объекта window, который устанавливает флаг вместо того, чтобы позволить ему произойти после другие вызовы службы кэширования завершены.

Ах, вы можете сказать, если Angular обнаружение изменений уже является вашим близким другом, но функция обратного вызова вызывается за пределами "1033 *" зоны "и поэтому не запускается обновление Angular просмотров. Вы были бы совершенно правы сказать это, потому что это так, и, следовательно, это не так. Проверка значений службы и компонента показывает, что флаг был обновлен правильно, но в представлении все еще отображается экран spla sh, как будто его нет.

Таким образом, все это происходит внутри службы, а не компонент, поэтому ChangeDetectorRef.detectChanges также будет генерировать ошибки и хаос. ApplicationRef.tick, однако, не будет. По крайней мере, на первый взгляд.

Вот так я и решил свою непосредственную проблему, но не понял, что случайно создал около миллиона других. Другие обновления значений компонентов и услуг, которые СЛЕДУЕТ и ранее ДОЛЖНЫ быть зафиксированы и отражены во время обычных процедур обнаружения изменений, больше не отражались в представлениях компонентов. Все данные были правильными, но ни одно из обновлений не происходило.

Удаление вызова на ApplicationRef.tick устранило все новые проблемы, но оставило меня еще раз при решении исходной проблемы запуска не Angular Функция обратного вызова для обновления Angular значений, доступных через Cloture. Что делать?

Мое (ограниченное) понимание предполагает, что использование ApplicationRef.tick магическим образом не превращает не Angular события в Angular события, а просто заставляет Angular запускать обновление обнаружения изменений в любом случае даже если он думает, что ничего интересного не произошло. Использование NgZone.run, с другой стороны, явно говорит Angular, что то, что вы собираетесь сделать, интересно и уместно, поэтому может произойти обычное тикание и обнаружение изменений и их получение.

Что Я не понимаю, хотя теперь он работает с NgZone.run, и мой интерес теперь чисто академический c, почему ApplicationRef.tick сломал все? Почему вещи, которые работали без него, внезапно перестали работать? Я что-то сломал, и это просто «недокументированная особенность» метода tick? Или это ошибка в Angular 6.1. 6 что мои бесстрашные усилия обнаружили почти два года спустя? Это было исправлено в более поздних версиях или он делает то, что должен делать, и я просто не настолько умен, как мне кажется, я не понимаю, почему?

TIA.

...