В Awesomplete состояние виджета не хранится в виде единого централизованного объекта «state», как в современных реактивных фреймворках. Вместо этого оно распределено между свойствами экземпляра, состоянием DOM-элементов и внутренними флагами, которые изменяются в процессе работы автодополнения. Понимание этих механизмов позволяет точно определять текущее поведение компонента и корректно синхронизировать его с логикой приложения.
Ключевые аспекты состояния включают:
Наиболее очевидный индикатор состояния — это факт отображения списка подсказок. Внутренне Awesomplete управляет этим через методы и флаги, связанные с жизненным циклом выпадающего меню.
Основные операции:
open() — принудительное открытие спискаclose() — закрытие спискаПроверка состояния чаще всего строится через косвенные признаки:
Во многих реализациях используется проверка логики вида:
if (awesomplete.ul && awesomplete.ul.childNodes.length) {
// список потенциально открыт
}
Однако более устойчивый подход связан с отслеживанием событий, а не DOM.
Awesomplete предоставляет набор внутренних полей, которые отражают текущее состояние работы компонента. Они не всегда задокументированы как публичный API, но широко используются в практических сценариях.
awesomplete.input — связанный input-элемент, косвенно
определяет контекст работыawesomplete.ul — DOM-элемент списка подсказокawesomplete.index — текущий индекс выделенного
элементаawesomplete.suggestions — массив текущих
отфильтрованных вариантовСостояние «активного выбора» можно определить через индекс:
index === -1 — нет активного выделенияindex >= 0 — пользователь перемещается по
спискуПрямого публичного метода isOpen() в базовой версии
Awesomplete нет, поэтому проверка обычно строится через комбинацию
факторов.
Практическая логика:
const isOpen =
awesomplete.ul &&
awesomplete.ul.style.display !== "none" &&
awesomplete.suggestions &&
awesomplete.suggestions.length > 0;
В некоторых версиях и форках используется дополнительный внутренний
флаг состояния, который переключается при вызове open() и
close().
Более стабильный подход — отслеживание событий:
awesomplete-openawesomplete-closeНавигация по списку подсказок — отдельная часть состояния. Она управляется через индекс текущего элемента.
index = -1 — ничего не выбраноindex = 0...n — выбран элемент в спискеnext() и
previous()Состояние выделения влияет на:
selectПроверка активного элемента может выглядеть так:
const hasSelection = awesomplete.index > -1;
Отдельный слой состояния связан с тем, какие элементы вообще доступны для отображения.
Awesomplete фильтрует исходный список на основе введённого текста, формируя:
awesomplete.suggestionsЭто ключевой массив, отражающий текущий «контекст поиска».
Сценарии состояния:
suggestions.length === 0 — нет подходящих
вариантовsuggestions.length > 0 — список может быть
открытЭто состояние напрямую связано с открытием/закрытием списка.
Input-элемент является источником состояния и одновременно его отражением.
Изменения input влияют на:
index = -1)Обратная связь:
input.valueПроверка состояния через input:
const hasValue = awesomplete.input.value.length > 0;
Хотя Awesomplete не строит сложную реактивную модель, часть состояния отражается через DOM.
Возможные признаки:
наличие вставленного ul списка
изменение стилей отображения (display,
visibility)
aria-атрибуты (в некоторых реализациях):
aria-expandedaria-activedescendantЭти атрибуты полезны для определения состояния доступности и визуальной активности компонента.
Наиболее надежный способ контроля состояния — подписка на события жизненного цикла компонента.
Основные события:
awesomplete-open — список открытawesomplete-close — список закрытawesomplete-select — выбран элементawesomplete-highlight — изменено выделениеПример логики отслеживания:
input.addEventListener("awesomplete-open", () => {
// состояние: открыт
});
input.addEventListener("awesomplete-close", () => {
// состояние: закрыт
});
События позволяют избежать прямого доступа к внутренним свойствам и обеспечивают устойчивую реакцию на изменения состояния.
Состояние Awesomplete изменяется под влиянием нескольких факторов одновременно:
Конфликты могут возникать при одновременном изменении input и вызове
open() или close(). В таких случаях итоговое
состояние определяется последним выполненным действием внутри цикла
событий.
В практическом коде часто используется комбинация условий, чтобы избежать ложных срабатываний.
Типовой паттерн:
const state = {
isOpen: !!(awesomplete.ul && awesomplete.suggestions.length),
hasSelection: awesomplete.index > -1,
hasSuggestions: awesomplete.suggestions.length > 0
};
Такой подход позволяет разделить разные аспекты состояния и не смешивать их в одну проверку.
При интеграции Awesomplete в интерфейсы с собственной логикой важно учитывать, что внутреннее состояние может меняться асинхронно относительно внешнего кода.
Основные риски:
Для предотвращения этих ситуаций предпочтительно опираться на событийную модель и минимизировать прямое чтение внутренних структур экземпляра.