Режим отладки

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


Включение режима отладки

Основной способ активации отладочной информации — передача параметра конфигурации при инициализации экземпляра:

const select = new TomSelect("#select", {
  debug: true
});

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

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


Структура отладочных сообщений

Отладочные сообщения Tom Select обычно группируются по следующим категориям:

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

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


Отслеживание жизненного цикла

Ключевые этапы жизненного цикла компонента являются основными точками для отладки:

  • onInitialize — завершение инициализации;
  • onFocus — получение фокуса;
  • onBlur — потеря фокуса;
  • onDropdownOpen — открытие списка;
  • onDropdownClose — закрытие списка;
  • onChange — изменение выбранного значения;
  • onItemAdd / onItemRemove — добавление и удаление элементов.

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

const select = new TomSelect("#select", {
  debug: true,
  onChange(value) {
    console.log("change:", value);
  },
  onItemAdd(value) {
    console.log("item add:", value);
  },
  onItemRemove(value) {
    console.log("item remove:", value);
  }
});

Отладка загрузки данных

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

  • входные параметры запроса;
  • состояние фильтра;
  • ответ сервера;
  • обработку ошибок.
const select = new TomSelect("#select", {
  valueField: "id",
  labelField: "title",
  searchField: "title",
  load(query, callback) {
    console.log("load query:", query);

    fetch(`/api/items?q=${encodeURIComponent(query)}`)
      .then(res => res.json())
      .then(data => {
        console.log("response:", data);
        callback(data);
      })
      .catch(err => {
        console.error("load error:", err);
        callback();
      });
  }
});

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


Инспекция состояния компонента

Внутреннее состояние экземпляра Tom Select может использоваться как источник отладочной информации:

  • items — выбранные значения;
  • options — доступные элементы;
  • lastQuery — последний поисковый запрос;
  • isOpen — состояние выпадающего списка;
  • activeItems — активные элементы интерфейса.

Пример диагностики:

console.log({
  items: select.items,
  options: select.options,
  isOpen: select.isOpen
});

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


Отладка фильтрации и поиска

Механизм поиска в Tom Select опирается на поле searchField и внутренний фильтр. При включённом режиме отладки можно анализировать:

  • входной поисковый запрос;
  • отфильтрованный набор;
  • поведение сортировки.

Расширенная диагностика:

const select = new TomSelect("#select", {
  debug: true,
  searchField: ["title"],
  score: function(search) {
    console.log("search term:", search);
    return function(item) {
      return 1;
    };
  }
});

Подмена функции оценки позволяет отслеживать процесс ранжирования результатов.


Взаимодействие с DOM

Tom Select активно манипулирует DOM-структурой, создавая собственные контейнеры для input, dropdown и элементов списка. Отладка в этом слое включает:

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

Типовые точки проверки:

console.log(select.wrapper);
console.log(select.dropdown);
console.log(select.control);

При визуальных ошибках (например, некорректное позиционирование) анализ DOM-узлов позволяет определить источник проблемы — CSS-конфликт или неверное состояние экземпляра.


Отладка плагинов

Плагины расширяют поведение Tom Select, добавляя новые UI-элементы и логику. При их использовании режим отладки позволяет выявлять:

  • порядок инициализации плагинов;
  • влияние на события;
  • модификацию данных.
const select = new TomSelect("#select", {
  plugins: {
    remove_button: {},
    clear_button: {}
  },
  debug: true
});

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


Диагностика ошибок конфигурации

Частые проблемы связаны с некорректной настройкой полей:

  • отсутствие valueField;
  • несоответствие labelField данным;
  • неправильный формат массива опций;
  • конфликт create: true с серверной валидацией.

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

console.log(select.settings);
console.log(select.options);

Производительность и узкие места

При больших наборах данных отладка включает анализ производительности:

  • количество элементов в options;
  • частота вызова load;
  • количество перерисовок dropdown;
  • стоимость фильтрации.

Типовой подход — добавление временных меток:

const t0 = performance.now();

select.refreshOptions();

const t1 = performance.now();
console.log("refresh time:", t1 - t0);

Это позволяет выявлять операции, влияющие на задержки интерфейса.


Логирование пользовательских расширений

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

const select = new TomSelect("#select", {
  render: {
    option(data, escape) {
      console.log("render option:", data);
      return `<div>${escape(data.title)}</div>`;
    }
  }
});

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


Комплексная трассировка событий

Для глубокой диагностики используется объединение всех событий в единый поток логов:

const select = new TomSelect("#select", {
  debug: true
});

["change", "item_add", "item_remove", "dropdown_open", "dropdown_close"].forEach(event => {
  select.on(event, (...args) => {
    console.log(event, args);
  });
});

Это формирует полную трассировку поведения экземпляра и упрощает поиск причин некорректной работы.


Отладка синхронизации состояния

Особое внимание требуется при синхронизации внешнего состояния (например, формы или state-менеджера) с внутренним состоянием Tom Select. Основные проблемы возникают при:

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

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

console.log("internal:", select.items);
console.log("external:", externalState);

Анализ повторной инициализации

При повторной инициализации на одном и том же DOM-элементе могут возникать утечки состояния. Отладка включает проверку:

  • удаления предыдущего экземпляра;
  • очистки событий;
  • восстановления DOM.
if (select) {
  select.destroy();
}

Контроль уничтожения экземпляра предотвращает дублирование обработчиков и некорректное поведение интерфейса.