Перерисовка отформатированного значения

Механизм обновления DOM при изменении значения

Перерисовка отформатированного значения в AutoNumeric опирается на синхронизацию внутреннего числового состояния и отображаемого строкового представления в input-элементе. Внутри библиотеки всегда существует два слоя данных: сырое значение (unformatted, числовое) и отформатированное значение (formatted, строка с разделителями, валютными символами и правилами локали).

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

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

Ключевой момент заключается в том, что обновление DOM не является простым присваиванием строки — это контролируемая перерисовка с учётом правил локализации и ограничений ввода.


Программное изменение значения и триггер перерисовки

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

Типовой сценарий:

  • set(value) или аналогичные методы
  • внутренний парсинг числа
  • вызов форматтера
  • обновление input.value

В AutoNumeric это сопровождается полной синхронизацией состояния экземпляра с DOM, что исключает рассинхронизацию между моделью и представлением.

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


Перерисовка при изменении опций форматирования

Изменение конфигурации (например, разделителей, валютного символа, количества знаков после запятой) требует полной переработки отображаемого значения.

При вызове обновления опций:

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

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


Влияние пользовательского ввода на перерисовку

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

При событии ввода выполняется цепочка:

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

Особенность AutoNumeric заключается в том, что ввод не хранится в «сыром виде» в поле, а постоянно преобразуется в форматированную строку, что создаёт эффект мгновенной перерисовки после каждого нажатия клавиши.


Сохранение позиции курсора при перерисовке

Одной из сложных задач является корректное восстановление позиции каретки после обновления значения.

При каждой перерисовке библиотека:

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

Без этой механики любое форматирование приводило бы к «скачкам» курсора, особенно при работе с большими числами или валютами.


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

В ряде случаев требуется не инкрементальное обновление, а полная перерисовка текущего значения. Это происходит при:

  • массовом изменении конфигурации;
  • переключении режима (например, integer → float);
  • восстановлении состояния после внешнего изменения DOM;
  • повторной инициализации экземпляра.

Внутри AutoNumeric это приводит к пересборке отображаемой строки на основе текущего числового состояния без доверия к существующему DOM-значению.


Синхронизация внутреннего состояния и DOM

Основной принцип работы перерисовки заключается в строгом разделении модели и представления:

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

При любом изменении выполняется двусторонняя синхронизация:

  1. DOM → модель (при вводе)
  2. модель → DOM (при форматировании)

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


Оптимизация частоты перерисовок

Частая перерисовка может приводить к нагрузке на DOM, особенно при быстром вводе. Поэтому в AutoNumeric применяются оптимизации:

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

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


Перерисовка при внешнем изменении значения DOM

Если значение input изменяется вне библиотеки (например, через прямое присваивание element.value), внутреннее состояние может потерять синхронизацию.

В таких случаях требуется принудительное обновление, которое:

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

Это восстанавливает целостность между представлением и моделью.


Поведение при ошибочных или частичных значениях

При неполном вводе (например, «-», «.» или пустая строка) перерисовка ведёт себя особым образом:

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

Такой подход предотвращает «дёргание» интерфейса при вводе и обеспечивает стабильную работу поля даже при некорректных промежуточных значениях.


Роль событий в процессе перерисовки

Каждая перерисовка сопровождается цепочкой событий, позволяющих интегрироваться с внешней логикой:

  • событие перед обновлением значения;
  • событие после форматирования;
  • события изменения и ввода.

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


Итоговая модель поведения перерисовки

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

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