В библиотеке Flatpickr большинство расширенных сценариев работы
строится вокруг событийной модели. Обработчики (onChange,
onOpen, onClose, onReady,
onMonthChange и другие) получают не только параметры
события, но и контекст выполнения, который критически важен для доступа
к внутреннему состоянию экземпляра календаря.
this
внутри обработчиковВо всех стандартных колбэках Flatpickr значение this
указывает на экземпляр календаря (fp instance). Это объект,
содержащий полное состояние компонента: выбранные даты, конфигурацию,
DOM-узлы и методы управления.
Ключевые свойства экземпляра:
this.selectedDates — массив выбранных датthis.currentMonth — текущий месяц (0–11)this.currentYear — текущий годthis.config — объект конфигурацииthis.input — связанный input-элементthis.calendarContainer — DOM-контейнер календаряthis.setDate() — установка даты программноthis.open() / this.close() — управление
состояниемПример базового использования:
flatpickr("#date", {
onChange: function(selectedDates, dateStr, instance) {
console.log(this === instance); // true
console.log(this.selectedDates);
}
});
В данном случае this и instance указывают
на один и тот же объект. Однако предпочтение обычно отдаётся
this, поскольку оно позволяет писать более компактный
код.
this и параметром instanceКаждый обработчик в Flatpickr получает третий аргумент —
instance. Он дублирует контекст this, но имеет
важное отличие: instance всегда передаётся явно, тогда как
this зависит от способа вызова функции.
Сигнатура обработчика:
function(selectedDates, dateStr, instance)
Сравнение:
| Способ доступа | Надёжность | Комментарий |
|---|---|---|
this |
зависит от типа функции | может быть потерян |
instance |
стабильный | всегда передаётся явно |
Внутри стандартных function-обработчиков this корректно
установлен библиотекой. Однако при изменении формы объявления функции
ситуация меняется.
Критический момент при работе с Flatpickr — использование стрелочных функций.
Стрелочные функции не создают собственный this. Они
наследуют его из внешней области видимости.
flatpickr("#date", {
onChange: (selectedDates, dateStr) => {
console.log(this); // не instance
}
});
В этом случае this будет:
window (в нестрогом режиме),undefined (в strict mode),Это полностью разрушает ожидаемую модель работы с экземпляром календаря.
Правильный вариант:
flatpickr("#date", {
onChange: function(selectedDates, dateStr) {
console.log(this.selectedDates);
}
});
Именно function, а не =>, обеспечивает
корректную привязку контекста.
bindИногда возникает необходимость сохранить контекст экземпляра вне
обработчика. В таких случаях применяется bind, однако его
использование в Flatpickr требует осторожности.
function handleChange(selectedDates) {
console.log(this.selectedDates);
}
flatpickr("#date", {
onChange: handleChange.bind(this)
});
Проблема заключается в том, что this в момент биндинга
может быть не тем, что ожидается. Если код выполняется в модуле,
this часто равен undefined.
Поэтому более корректный подход — явная привязка к инстансу через замыкание:
flatpickr("#date", {
onReady: function(selectedDates, dateStr, instance) {
const handler = handleChange.bind(instance);
handler();
}
});
Но такой подход используется редко, так как instance уже
доступен напрямую.
thisНа практике при работе с Flatpickr часто предпочтительнее
игнорировать this и использовать instance,
захваченный через замыкание.
flatpickr("#date", {
onChange: function(selectedDates, dateStr, instance) {
const fp = instance;
function logState() {
console.log(fp.currentYear, fp.currentMonth);
}
logState();
}
});
Такой подход:
this,this в пользовательских методах экземпляраЭкземпляр Flatpickr содержит методы, которые также используют внутренний контекст. Например:
const fp = flatpickr("#date");
fp.setDate("2026-01-01");
fp.open();
При вызове методов напрямую this внутри них указывает на
сам экземпляр.
Однако при извлечении метода в переменную контекст теряется:
const open = fp.open;
open(); // потеря контекста
В результате this становится undefined, и
метод не работает корректно.
Решение:
const open = fp.open.bind(fp);
open();
или
fp.open();
Flatpickr поддерживает плагины, которые также получают доступ к
экземпляру. Внутри плагина this обычно указывает на сам
плагин, а экземпляр передаётся как аргумент.
function myPlugin(fp) {
console.log(fp.selectedDates);
}
При этом важно различать:
this внутри обработчиков событий → instancethis внутри плагина → plugin contextfp → экземпляр календаряОшибки часто возникают при попытке использовать this
внутри стрелочных функций в плагинах:
function myPlugin(fp) {
fp.config.onChange.push(() => {
console.log(this); // не fp
});
}
Здесь this не связан с экземпляром, и логика
ломается.
В реальных проектах с Flatpickr повторяются несколько типовых ошибок:
1. Использование стрелочных функций в обработчиках
onOpen: () => {
console.log(this); // ошибка контекста
}
2. Потеря контекста при деструктуризации методов
const { setDate } = flatpickr("#date");
setDate("2026-01-01"); // ошибка
3. Попытка использовать this вне
функции-обработчика
let fp = flatpickr("#date");
function test() {
console.log(this.selectedDates); // undefined
}
При разработке на базе Flatpickr наиболее устойчивой считается модель, в которой:
this используется только внутри
function-обработчиковinstance используется для явного доступа к APIbindЭта модель устраняет неоднозначности и делает поведение календаря предсказуемым даже при сложной композиции событий.
При последовательных вызовах событий Flatpickr важно учитывать, что каждый обработчик получает новый вызов с актуальным состоянием экземпляра.
Пример цепочки:
flatpickr("#date", {
onOpen: function(selectedDates, dateStr, instance) {
console.log(this.currentMonth);
},
onMonthChange: function(selectedDates, dateStr, instance) {
console.log(this.currentMonth);
},
onClose: function(selectedDates, dateStr, instance) {
console.log(this.selectedDates.length);
}
});
Во всех случаях this остаётся одним и тем же объектом —
текущим экземпляром календаря, но его состояние меняется между
событиями.
thisКонтекст в Flatpickr следует рассматривать как часть API, а не как побочный эффект JavaScript. Он стабилен внутри function-обработчиков, но легко разрушается при использовании стрелочных функций, извлечении методов или неверной привязке.
Правильная работа с ним опирается на три принципа:
instance при сомнениях