Мотивация
Я работал с выпадающим компонентом библиотеки Ng-zorro в одном из приложений и думал, почему неудобно просматривать динамически добавляемые компоненты и применять некоторые стили в инструменте разработки браузера? Например, когда мы наводим указатель мыши на раскрывающийся список и переходим с помощью мыши в инспектор браузера, содержимое раскрывающегося списка исчезает. Содержимое раскрывающегося списка создается динамически и размещается в DOM. При наведении на раскрывающийся список он удаляется из DOM. Это поведение популярно для всплывающей подсказки, модальных окон, диалогов и других плавающих панелей в библиотеках с Angular CDK.
В этом посте я хочу описать свое решение, как проверить компоненты оверлея с помощью инструментов разработчика браузера в библиотеках с Angular CDK. Я покажу это на выпадающем примере из библиотеки Ng-zorro, потому что у меня была задача с ним.
Поиск компонента оверлея
Компонент оверлея отображается в нижней части страницы:
Когда мы наводим указатель мыши на раскрывающийся список, мы видим, что внутри cdk-overlay-container добавлено «что-то»:
Было бы круто, если бы мы могли заморозить время в момент наведения из выпадающего списка. Таким образом, мы можем проверять и изменять содержимое непосредственно в инструментах разработчика.
Модификации поддерева отладки
Мы можем запустить отладчик в момент этих модификаций DOM внутри оверлейного div. Мы можем сделать это с помощью опции «модификации поддерева» инструментов разработчика. Вы можете найти эту опцию в контекстном меню cdk-overlay-container:
Мы включим эту опцию и проанализируем все инициированные действия, когда что-то было изменено в cdk-overlay-container, чтобы мы могли найти действие, которое отсоединяет содержимое оверлея от DOM:
Снова наведите раскрывающееся меню. Код будет приостановлен в отладчике:
Нажимаете Prettify и наблюдаете более-менее понятный код:
Мы увидим, что был вызван метод createHostElement. Вероятно, сотрудничество этого метода заключается в динамическом создании раскрывающегося списка. Теперь нам нужно найти некоторый метод, который будет вызываться перед уничтожением выпадающего содержимого. Затем установите в нем точку останова. Нам нужно пройти через все установленные точки останова с помощью отладчика и найти какой-нибудь метод, похожий на `detach`.
Отсоединение компонента наложения
После исследования и обнаружения события detach мы можем установить здесь точку останова:
Теперь, когда вы закончите очередь точек останова и повторите зависание, экран будет зависать при перемещении курсора из раскрывающегося списка. С помощью этого вы можете перейти на вкладку «Элементы», проверить элементы внутри оверлея и попробовать протестировать свои стили или другую логику в браузере. И ничего не исчезнет:
Резюме
Этот подход применим не только для библиотек Angular CDK, но и для других фреймворков и библиотек. Главное — отладить код и установить точку останова для события, удаляющего оверлейный компонент.