Метод evaluate

Метод evaluate в библиотеке Awesomplete является центральной точкой механизма обновления списка подсказок. Он отвечает за пересчёт текущих совпадений, фильтрацию исходного набора данных, сортировку результатов и обновление UI выпадающего списка автодополнения.

По сути, evaluate — это внутренний «двигатель» экземпляра автокомплита, который синхронизирует значение input-поля с актуальными предложениями и состоянием выпадающего меню.


Роль метода evaluate в жизненном цикле автодополнения

evaluate вызывается в момент, когда требуется пересчитать список предложений. Это происходит в нескольких сценариях:

  • изменение значения в поле ввода;
  • программное изменение input.value;
  • вызов метода evaluate() вручную;
  • повторное открытие списка после изменения источника данных;
  • изменение фильтрующей логики или параметров экземпляра.

Внутри архитектуры Awesomplete метод выполняет роль связующего звена между пользовательским вводом и механизмом отображения списка.


Общая логика работы

При вызове evaluate происходит последовательная цепочка операций:

  1. Чтение текущего значения input
  2. Проверка минимального количества символов
  3. Нормализация строки запроса
  4. Получение исходного набора данных
  5. Фильтрация списка
  6. Сортировка совпадений
  7. Ограничение количества результатов
  8. Рендеринг списка
  9. Открытие или обновление dropdown

Каждый этап может быть переопределён через настройки экземпляра.


Упрощённая сигнатура метода

Хотя evaluate не требует входных параметров в стандартном использовании, логически его можно представить так:

instance.evaluate();

Где instance — экземпляр Awesomplete.


Внутренние этапы выполнения

1. Получение текущего запроса

Метод извлекает значение поля ввода:

var input = this.input.value;

Далее строка подготавливается: приводится к единому регистру, обрезаются лишние пробелы, применяются пользовательские преобразования (если заданы).


2. Проверка порога символов

Awesomplete использует параметр minChars, который ограничивает ранний запуск поиска:

if (input.length < this.minChars) {
    this.close();
    return;
}

Если количество символов недостаточно, список принудительно закрывается.


3. Получение источника данных

Источник может быть задан как:

  • массив строк;
  • массив объектов;
  • функция-генератор.

В evaluate источник нормализуется к единому формату для дальнейшей обработки.


4. Фильтрация

Фильтрация — ключевая часть метода. Она определяет, какие элементы попадут в список.

По умолчанию используется простое сопоставление подстроки:

item.toLowerCase().indexOf(input.toLowerCase()) !== -1

Однако Awesomplete позволяет заменить фильтр через filter:

filter: function(text, input) {
    return text.startsWith(input);
}

Внутри evaluate вызывается именно эта логика.


5. Сортировка результатов

После фильтрации список сортируется через функцию sort (если она задана).

Типичная логика:

  • более точные совпадения выше;
  • совпадения в начале строки выше;
  • более короткие варианты приоритетнее.

6. Ограничение количества результатов

Параметр maxItems ограничивает число отображаемых элементов:

results = results.slice(0, this.maxItems);

Это предотвращает перегрузку интерфейса и повышает производительность.


7. Обновление списка

После формирования массива результатов evaluate вызывает рендеринг:

  • очищается старый список;
  • создаются DOM-элементы;
  • добавляются обработчики событий;
  • обновляется состояние активного элемента.

8. Управление состоянием dropdown

Если есть результаты, список открывается:

this.open();

Если результатов нет — список закрывается:

this.close();

Связь с другими методами

Метод evaluate тесно связан с другими частями API:

  • open() — отображение списка;
  • close() — скрытие списка;
  • goto() — перемещение активного элемента;
  • select() — выбор элемента;
  • next() / previous() — навигация по списку.

evaluate является триггером, который часто инициирует последующую работу этих методов.


Вызов evaluate при вводе текста

В стандартной конфигурации Awesomplete привязывает evaluate к событию input:

this.input.addEventListener("input", function() {
    self.evaluate();
});

Таким образом любое изменение поля автоматически пересчитывает подсказки.


Пример использования

var input = document.querySelector("input");

var awesomplete = new Awesomplete(input, {
    list: ["Apple", "Banana", "Orange", "Grape", "Kiwi"]
});

// Программный пересчёт подсказок
awesomplete.evaluate();

После вызова метод принудительно пересчитает список даже без пользовательского ввода.


Особенности поведения

Асинхронные источники

Если список формируется динамически (через функцию), evaluate может работать с уже обновлёнными данными, что позволяет интегрировать AJAX-подгрузку.


Повторные вызовы

Многократный вызов evaluate безопасен: он перезаписывает состояние списка без накопления побочных эффектов.


Производительность

При больших массивах данных именно evaluate становится наиболее затратной частью. Оптимизация обычно достигается через:

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

Взаимодействие с пользовательскими настройками

Метод учитывает следующие параметры экземпляра:

  • minChars — минимальная длина запроса;
  • maxItems — ограничение результатов;
  • filter — функция фильтрации;
  • sort — функция сортировки;
  • autoFirst — автовыбор первого элемента.

Каждый из этих параметров влияет на результат работы evaluate, не требуя изменения самого метода.


Поведение при пустом вводе

Если поле ввода пустое, поведение зависит от конфигурации:

  • при minChars > 0 список закрывается;
  • при разрешённом пустом поиске может отображаться полный список;
  • кастомные фильтры могут переопределять это поведение.

Внутреннее состояние после выполнения

После завершения evaluate обновляются внутренние свойства экземпляра:

  • текущий список результатов;
  • индекс активного элемента;
  • состояние открытия dropdown;
  • DOM-структура списка.

Эти данные используются другими методами без повторного вычисления.