ApplicationRef.tick Вызывает проблемы в Angular 6.1.6

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

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

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

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

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

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

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

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

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

TIA.

0 ответов

Другие вопросы по тегам