Библиотека строится вокруг реактивного поведения, где ключевые точки взаимодействия с календарём реализованы через набор событийных колбэков. Архитектура исключает необходимость опроса состояния и делает управление датами и интерфейсом зависимым от жизненного цикла компонента.
Каждый экземпляр календаря содержит внутренний механизм диспетчеризации, который вызывает пользовательские обработчики в строго определённые моменты: выбор даты, открытие и закрытие календаря, перерисовка интерфейса. Эти точки служат основным каналом передачи данных наружу.
Колбэки событий в Pikaday вызываются в контексте текущего экземпляра
календаря. Это означает, что this внутри обработчика
указывает на объект Pikaday, содержащий состояние, методы и
конфигурацию текущего календаря.
Такой подход обеспечивает доступ к внутренним данным без необходимости передавать их через аргументы:
new Pikaday({
onOpen: function () {
console.log(this.getDate());
console.log(this.el);
}
});
Контекст позволяет извлекать состояние напрямую, включая выбранную дату, DOM-элемент привязки, текущие настройки отображения и локализацию.
Событие выбора даты является центральной точкой передачи данных наружу. Оно вызывается при выборе дня пользователем и передаёт два ключевых элемента: выбранную дату и экземпляр календаря.
Сигнатура:
onSelect: function(date) {}
Первый аргумент всегда представляет объект Date,
нормализованный к локальному времени. Это значение уже преобразовано
внутренним парсером и готово к использованию без дополнительной
обработки.
Пример извлечения и преобразования:
new Pikaday({
onSelect: function(date) {
const iso = date.toISOString();
this._o.field.value = iso;
}
});
Второй канал передачи данных — сам экземпляр через this.
Он позволяет синхронизировать состояние интерфейса с внешними
компонентами:
onSelect: function(date) {
const formatted = this.toString(date);
console.log('Formatted:', formatted);
}
Таким образом, событие выполняет двойную роль: передаёт первичные данные через аргументы и предоставляет расширенный доступ через контекст.
Передача данных через события часто дополняется встроенным
форматированием. Метод toString используется для
преобразования объекта Date в строковое представление
согласно заданному формату.
onSelect: function(date) {
const formatted = this.toString(date, 'YYYY-MM-DD');
this._o.field.value = formatted;
}
Форматирование не является частью события, но участвует в формировании выходного значения, что делает обработчик промежуточным слоем трансформации данных.
Событие открытия календаря не передаёт дату как основной параметр, но предоставляет доступ к состоянию компонента через контекст. Это позволяет извлекать текущую выбранную дату, позицию календаря и связанные DOM-узлы.
new Pikaday({
onOpen: function() {
const current = this.getDate();
const node = this.el;
console.log(current, node);
}
});
Передача данных здесь носит косвенный характер: состояние не передаётся через аргументы, а извлекается из объекта экземпляра.
Событие закрытия календаря используется как сигнал завершения взаимодействия. Оно не предоставляет дополнительных аргументов, но позволяет считывать итоговое состояние через методы экземпляра.
onClose: function() {
const selected = this.getDate();
console.log('Final date:', selected);
}
Закрытие календаря часто используется для финализации данных, синхронизации с формами и отправки значений во внешние системы.
Событие перерисовки интерфейса вызывается при каждом изменении визуального состояния календаря: смене месяца, года, локали или внутренних данных.
onDraw: function() {
console.log('Redraw cycle');
}
Хотя аргументы отсутствуют, через this доступны все
актуальные параметры отображения. Это позволяет извлекать динамическое
состояние UI в момент построения DOM.
onDraw: function() {
const month = this.calendars[0].month;
const year = this.calendars[0].year;
console.log(month, year);
}
Помимо стандартных событий, данные могут передаваться через замыкания, формируя внешний контекст обработки событий.
const externalState = {
source: 'formA'
};
new Pikaday({
onSelect: function(date) {
externalState.lastDate = date;
}
});
В этом случае события выступают как мост между внутренним состоянием календаря и произвольной структурой данных приложения.
Наиболее распространённый сценарий — синхронизация выбранной даты с полем ввода. В этом случае события выступают механизмом двусторонней передачи данных: из UI в модель формы и обратно.
new Pikaday({
field: document.querySelector('#date'),
onSelect: function(date) {
this._o.field.value = this.toString(date, 'DD.MM.YYYY');
}
});
Передача данных происходит синхронно: событие выбора немедленно обновляет значение DOM-элемента, что исключает необходимость дополнительных обработчиков.
События Pikaday могут использовать результаты предыдущих вызовов для
формирования нового состояния. Например, onSelect влияет на
onClose, поскольку закрытие календаря отражает уже
выбранное значение.
new Pikaday({
onSelect: function(date) {
this._selectedSnapshot = date;
},
onClose: function() {
console.log(this._selectedSnapshot);
}
});
Такой подход формирует временное хранилище внутри экземпляра, позволяющее передавать данные между различными фазами жизненного цикла.
Экземпляр календаря может быть расширен произвольными полями для передачи данных между событиями без внешних структур.
new Pikaday({
onOpen: function() {
this.sessionId = Date.now();
},
onSelect: function(date) {
console.log(this.sessionId, date);
}
});
Данный механизм превращает объект календаря в контейнер состояния, где события взаимодействуют через общие свойства.
Дополнительный уровень управления событиями достигается через переопределение методов экземпляра. Это позволяет вмешиваться в поток данных до и после стандартных событийных вызовов.
const picker = new Pikaday({
onSelect: function(date) {
const original = this.toString(date);
this._formatted = original;
}
});
В дальнейшем значение может использоваться другими частями приложения без повторного вычисления.
Событийная система Pikaday фактически формирует промежуточный слой между DOM и бизнес-логикой. Данные проходят следующий путь:
Такой поток обеспечивает детерминированное поведение без необходимости централизованного хранилища событий.
При наличии нескольких календарей события каждого экземпляра
изолированы, но структура передачи данных остаётся одинаковой.
Разделение достигается через контекст this.
const pickerA = new Pikaday({
onSelect: function(date) {
console.log('A:', date);
}
});
const pickerB = new Pikaday({
onSelect: function(date) {
console.log('B:', date);
}
});
Изоляция гарантирует отсутствие перекрёстной утечки данных между экземплярами, при этом механизм передачи остаётся единым.
Событийная архитектура формирует двухканальную модель передачи информации: аргументы событий обеспечивают первичный поток данных, контекст экземпляра предоставляет доступ к расширенному состоянию. В совокупности это создаёт гибкую систему, в которой данные могут передаваться, трансформироваться и сохраняться на разных этапах жизненного цикла календаря без внешних посредников.