Deprecated функции

Эволюция Awesomplete сопровождалась постепенным упрощением публичного интерфейса и отказом от ряда ранних решений, которые использовались в первых версиях библиотеки. Основная цель этих изменений заключалась в уменьшении поверхности API, повышении предсказуемости поведения и снижении зависимости от внутренних реализаций.


Общая концепция устаревших функций

В контексте Awesomplete под устаревшими механизмами понимаются не только конкретные методы, но и целые модели использования, которые:

  • опирались на внутренние свойства экземпляра;
  • дублировали функциональность более новых API;
  • затрудняли расширение и кастомизацию;
  • могли приводить к нестабильному поведению при обновлениях версии.

Такие элементы обычно сохранялись в кодовой базе некоторое время ради обратной совместимости, но в документации постепенно теряли рекомендательный статус.


Внутренний helper Awesomplete.$

Одним из ранних утилитарных элементов был DOM-helper, условно обозначаемый как Awesomplete.$. Он использовался для упрощённого доступа к DOM-элементам и их создания.

Типичный паттерн:

Awesomplete.$("div", {
  className: "awesomplete-item",
  textContent: "Example"
});

Со временем подобный подход был признан избыточным, так как:

  • дублировал возможности стандартного document.createElement;
  • скрывал явную работу с DOM;
  • усложнял интеграцию с современными сборщиками и фреймворками.

В актуальных реализациях предпочтение отдаётся прямому DOM API без промежуточных абстракций.


Ранние варианты управления списком

В старых подходах управление списком предложений часто осуществлялось через прямое взаимодействие с внутренними массивами экземпляра, например условные конструкции вида:

instance._list = ["one", "two", "three"];
instance.evaluate();

Проблема такого подхода заключалась в том, что:

  • свойства с подчёркиванием считались внутренними;
  • их структура могла изменяться без уведомления;
  • логика пересчёта состояния не была явно инкапсулирована.

Позднее акцент сместился в сторону передачи данных через публичные интерфейсы и конфигурационные параметры, исключающие необходимость прямого вмешательства во внутренние поля.


Устаревшая модель вызова evaluate через внешние триггеры

Метод evaluate() в ранних версиях нередко использовался как универсальный триггер пересчёта состояния списка. Его вызывали не только при изменении значения input, но и для ручной синхронизации состояния.

awesompleteInstance.evaluate();

Со временем такой подход стал считаться нежелательным, поскольку:

  • нарушал реактивную модель поведения компонента;
  • создавал скрытые зависимости между состояниями;
  • приводил к труднодиагностируемым повторным рендерам.

Современная модель предполагает автоматическую реакцию на события ввода без необходимости явного вызова пересчёта в большинстве сценариев.


Изменения в обработке навигации (next, previous, goto)

Навигационные методы списков предложений использовались напрямую для управления активным элементом:

awesomplete.next();
awesomplete.previous();
awesomplete.goto(2);

Хотя сами методы сохранились как часть API, их активное использование вне внутренних обработчиков событий клавиатуры считается устаревшим паттерном.

Причины:

  • логика навигации должна быть привязана к пользовательским событиям;
  • ручное управление индексом ломает синхронизацию состояния;
  • возможны расхождения между UI и внутренним состоянием.

В современных архитектурах предпочтение отдаётся управлению через события клавиатуры и фокус ввода, а не прямому вызову навигационных методов.


Ранние варианты кастомного рендеринга

До стабилизации API рендеринга в Awesomplete использовались подходы, при которых разработчик напрямую модифицировал DOM-структуру списка после его генерации.

Пример типичного устаревшего паттерна:

awesompleteInstance.ul.innerHTML += "<li>Custom item</li>";

Подобные операции считались проблемными, так как:

  • нарушали внутреннюю структуру компонента;
  • обходили механизмы обновления состояния;
  • могли приводить к неконсистентному выделению активного элемента.

Позднее рекомендованным подходом стало использование официальных точек расширения и шаблонов рендеринга, предоставляемых библиотекой.


Использование приватных свойств (_input, _list, _ul)

Ранние версии библиотеки активно использовали соглашение об именовании с подчёркиванием для обозначения внутренних свойств экземпляра:

  • _input
  • _list
  • _ul
  • _index

Несмотря на то, что такие свойства технически доступны, их использование вне внутренней логики библиотеки относится к устаревшей практике.

Причины отказа от прямого обращения:

  • отсутствие гарантий стабильности структуры;
  • зависимость кода приложения от внутренней реализации;
  • сложность миграции между версиями.

Устаревшие события DOM-интеграции

В ранних реализациях Awesomplete активно использовались прямые привязки к DOM-событиям через inline-обработчики или ручное добавление слушателей вне API библиотеки:

input.onke yup = function () {
  awesompleteInstance.evaluate();
};

Такая модель постепенно вытеснялась встроенной обработкой событий внутри компонента, где библиотека самостоятельно контролирует:

  • ввод текста;
  • открытие списка;
  • закрытие списка;
  • выбор элемента.

Ручная привязка событий сохранилась только для специфических кастомных сценариев и интеграций с нестандартными UI-контейнерами.


Устаревшие подходы к фильтрации данных

В ранних версиях нередко использовалась внешняя фильтрация массива перед передачей в Awesomplete:

const filtered = list.filter(item => item.startsWith(input.value));
awesompleteInstance.list = filtered;

Проблема данного подхода заключалась в дублировании логики фильтрации, уже реализованной внутри библиотеки.

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


Переход от прямого управления состоянием к декларативной модели

Общая тенденция отказа от устаревших функций в Awesomplete сводится к переходу от императивного управления компонентом к более декларативной модели:

  • вместо ручного вызова методов — реакция на события;
  • вместо модификации внутренних полей — использование публичных свойств;
  • вместо DOM-манипуляций — использование встроенного рендера;
  • вместо вспомогательных хелперов — стандартные Web API.

Такой подход снижает связанность кода и делает поведение автодополнения более предсказуемым в сложных интерфейсах.