Программная инженерия
Создайте пользовательское угловое приложение с автозаполнением поиска с помощью динамической таблицы
Поиграйте с CSS-оверлеем и компонентами Angular Material
Потому что проблемы, с которыми мы сталкиваемся, никогда не закончатся.
И потому что, как программисты, мы никогда не перестанем учиться и совершенствоваться.
Потому что веб-разработка - это искусство и игра, в которую мы можем играть по правилам.
По этим причинам сегодня мы реализуем настраиваемое автозаполнение, которое отображает динамическую таблицу в ее оверлее, и экспортируем ее как библиотеку Angular, как показано в следующем видео:
- Число, тип и имена столбцов передаются в качестве входных данных в динамическую таблицу.
- Компонент, содержащий настраиваемое автозаполнение, предоставляет список данных для таблицы. Этот список может быть статическим или динамическим (наблюдаемый).
- Пользователь может выбрать опцию из отображаемого списка опций щелчком мыши или перемещаясь с помощью стрелок клавиатуры и нажимая клавишу
Enter
. Когда нажата стрелка вниз или вверх, опция в списке, у которой есть фокус, выделяется, чтобы улучшить взаимодействие с пользователем. - Всякий раз, когда выбирается опция, в хост-компонент возвращается событие.
- Каждый раз, когда пользователь меняет поисковый запрос, компоненту хостинга также возвращается событие, что очень полезно, например, в случае, если мы хотим получить новый список данных с HTTP-сервера.
Эта статья является второй частью предыдущей статьи: Создайте многоразовый степпер как библиотеку Angular. Сегодняшняя библиотека не зависит от старой, но в демонстрационных целях мы расширим шаблон порядка создания с помощью настраиваемого автозаполнения в качестве нового поля, чтобы увидеть, как его использовать.
Итак, приступим.
Создать новую библиотеку
Наш настраиваемый модуль автозаполнения будет создан как библиотека в папке projects
. Вы можете ознакомиться с исходным кодом, доступным на GitHub здесь. Перейдите в корневую папку проекта и выполните в терминале следующую команду:
ng generate library custom-autocomplete
Создайте компоненты библиотеки
При генерации наших компонентов мы должны указать флаг --project
, чтобы сообщить Angular CLI, чтобы они сгенерировали их в соответствующей папке библиотеки. Для достижения сегодняшней цели нам нужны два компонента:
ng generate component components/option-search-overlay --project=custom-autocomplete --export ng generate component components/mat-dynamic-table --project=custom-autocomplete --export ng generate directive directives/click-outside --project=custom-autocomplete ng generate pipe pipes/get-total --project=custom-autocomplete
Компонент Option-Search-Overlay
Первый компонент, option-search-overlay
, отображает поле ввода, в которое пользователь может ввести поисковый запрос, и автоматически открывает оверлей, который показывает правильный результат для данного фильтра. Вот как выглядит шаблон:
И часть TypeScript:
Есть пять слушателей клавиатуры:
- Два слушателя для
keydown.arrowdown
иkeydown.arrowup
для навигации по списку опций - Один слушатель для клавиши
keydown.enter
для выбора варианта - Один слушатель для клавиши
keydown.esc
, чтобы закрыть оверлей, если он открыт - Один слушатель для
keydown
в поле формыinput
, чтобы открывать оверлей, когда пользователь запускает t
Как вы могли заметить, второй компонент mat-dynamic-table
является потомком первого option-search-overlay
.
Когда пользователь начинает вводить текст в поле input
, мы визуализируем элемент DOM ng-template
, содержащий динамическую таблицу. Для этого мы используем пакет overlay
из Angular CDK, который позволяет открывать плавающие панели на экране:
import { OverlayModule } from '@angular/cdk/overlay';
Вот отрывок с сайта javatpoint.com, объясняющий, что такое оверлей и как их использовать:
«Накладка - это покрытие поверхности чего-либо покрытием. Другими словами, он используется, чтобы поставить одну вещь поверх другой. Наложение делает веб-страницу привлекательной, и ее легко спроектировать.
Создание эффекта наложения означает соединение двух div в одном месте, но при необходимости они появятся. Чтобы появился второй div, мы можем навести указатель мыши на один div или щелкнуть по нему ».
Давайте посмотрим на более наглядное представление наложения и посмотрим, как его реализовать с помощью Angular Material:
Я добавил следующие атрибуты в поле формы input
:
cdkOVerlayOrigin #trigger=”cdkOverlayOrigin”
К тегу ng-template
я добавил один атрибут и два поля ввода:
cdkConnectedOverlay
[cdkConnectedOverlayOrigin]=”trigger” [cdkConnectedOverlayOpen]=”isOverlayOpen”
- Значение
trigger
связывает элементng-template
DOM с полем формыinput
- Значение
isOverlayOpen
инициализируется с помощьюfalse
вoption-search-overlay.component.ts
, затем обновляется в зависимости от состояния наложения:
Чтобы этого избежать, наложение остается открытым, когда пользователь покидает его, не выбрав параметр. Я использовал директиву clickOutside
, которая обнаруживает любой щелчок по document
за пределами элемента DOM, в котором используется эта директива. В таком случае будет выполнен метод closeOverlay()
:
Компонент динамической таблицы
Второй компонент, mat-dynamic-table
, представляет собой динамическую таблицу материалов, то есть не зависит от списка столбцов. В шаблоне у нас есть цикл по списку displayColumnDefs
для определения имени, метки, значения и типа каждого столбца:
Вот часть TypeScript:
Чтобы вычислить сумму в нижнем колонтитуле таблицы для столбцов типа number
, я создал канал getTotal
. Труба намного лучше по производительности, чем по методу. Я показываю нижний колонтитул только в том случае, если параметр hasFooter
равен true
в определении столбца:
Использование библиотеки в представлении создания заказа
Все, что нам нужно сейчас, чтобы увидеть результат того, что мы реализовали до сих пор, - это обновить форму на первом этапе создания заказа, вставив option-search-overlay
в качестве нового поля:
Мы должны настроить компонент T ypeScript, добавив массив displayColumnDefs
, который определяет список столбцов для наложения автозаполнения. Нам также нужно определить optionSearchConfig
:
Теперь у нас есть все необходимое для развертывания приложения и игры с ним, как показано на видео выше.
Хотите попробовать сами?
Идите вперед и клонируйте окончательное и полноценное решение, доступное в этом репозитории GitHub.
Исходный код поддерживает отображение столбца checkbox
в mat-dynamic-table
. Очень полезно иметь функцию множественного выбора для нашего автозаполнения поиска.
Следующая часть для этого приложения доступна здесь:
Спасибо за прочтение! Я надеюсь, что это было полезно и вдохновляло в вашем путешествии по программированию.
🧠💡 Я пишу о технике, технологиях и лидерстве для сообщества умных и любопытных людей. Подпишитесь на мою бесплатную рассылку новостей по электронной почте для эксклюзивного доступа или подпишитесь на Medium здесь.