Приоритет локальных настроек

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

Иерархия конфигурации

Система разрешения параметров в AutoNumeric строится по принципу приоритетного переопределения. Каждый следующий уровень способен заменить значения предыдущего:

  1. Глобальные настройки библиотеки
  2. Фабричные или предустановленные конфигурации
  3. Локальные настройки экземпляра
  4. HTML-атрибуты элемента
  5. Динамические изменения во время выполнения

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

Глобальные настройки как базовый слой

Глобальная конфигурация задаёт поведение библиотеки по умолчанию. Она применяется ко всем экземплярам, если не указано иное.

AutoNumeric.setGlobal({
  digitGroupSeparator: ' ',
  decimalCharacter: ',',
  currencySymbol: '₽ ',
  decimalPlaces: 2
});

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

Фабричные конфигурации как промежуточный уровень

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

new AutoNumeric(element, 'euroPositional');

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

Локальные настройки как приоритетный уровень

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

const an = new AutoNumeric('#price', {
  decimalCharacter: '.',
  digitGroupSeparator: ',',
  decimalPlaces: 4,
  currencySymbol: '$ '
});

В этом случае поле #price полностью игнорирует соответствующие глобальные параметры, заменяя их собственными значениями.

Механизм наложения параметров

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

  • создаётся копия глобальной конфигурации
  • накладывается фабричная конфигурация (если используется)
  • поверх накладываются локальные параметры
  • затем применяются значения из HTML-атрибутов

Локальные настройки выступают как финальный слой перед инициализацией внутреннего состояния экземпляра.

HTML-атрибуты как дополнительный источник локальности

AutoNumeric позволяет задавать часть параметров через data-* атрибуты. Эти значения интерпретируются как локальные и участвуют в процессе переопределения.

<input id="amount"
       data-digit-group-separator="."
       data-decimal-character="," />

При инициализации:

new AutoNumeric('#amount', {
  decimalPlaces: 2
});

HTML-атрибуты будут объединены с переданными параметрами, при этом локальная конфигурация в JavaScript всё равно имеет более высокий приоритет при конфликте ключей.

Поведение при конфликте параметров

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

  • глобально: decimalPlaces = 2
  • локально: decimalPlaces = 5

Итоговое значение: 5

При этом важно учитывать, что часть параметров является зависимой. Например, символы разделителей влияют на форматирование числа и могут изменять поведение парсинга, даже если числовые параметры совпадают.

Динамическое изменение локальных настроек

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

an.update({
  decimalPlaces: 3,
  currencySymbol: '€ '
});

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

Частичное обновление и сохранение состояния

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

Это поведение особенно важно при изменении:

  • количества десятичных знаков
  • символов группировки
  • валютных обозначений
  • правил округления

Особенности при повторной инициализации

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

an.remove();
new AutoNumeric('#price', { decimalPlaces: 2 });

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

Приоритет локальных настроек и внутренние флаги

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

Это создаёт дополнительный уровень логики:

  • структурные параметры (формат числа) — полностью переопределяются локально
  • поведенческие параметры (события, ограничения ввода) — могут частично игнорировать локальные изменения

Слияние вложенных объектов

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

Пример условной структуры:

{
  outputFormat: {
    style: 'number',
    roundingMethod: 'HalfUp'
  }
}

Локальное переопределение изменяет только часть структуры:

new AutoNumeric('#field', {
  outputFormat: {
    roundingMethod: 'Floor'
  }
});

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

Приоритет при использовании нескольких экземпляров

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

const a = new AutoNumeric('#a', { decimalPlaces: 2 });
const b = new AutoNumeric('#b', { decimalPlaces: 6 });

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

Типичные конфликты локальных настроек

Наиболее частые ситуации, связанные с приоритетом локальных параметров:

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

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

Поведение при частичном указании параметров

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

AutoNumeric.setGlobal({
  decimalPlaces: 2,
  digitGroupSeparator: ' '
});

new AutoNumeric('#field', {
  currencySymbol: '€ '
});

В результате поле получает:

  • decimalPlaces = 2 (глобально)
  • digitGroupSeparator = ' ' (глобально)
  • currencySymbol = '€ ' (локально)

Влияние порядка инициализации

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

const an = new AutoNumeric('#field', { decimalPlaces: 2 });

AutoNumeric.setGlobal({
  decimalPlaces: 6
});

В этом случае локальное значение сохраняет приоритет, и поле остаётся с decimalPlaces = 2.

Поведение при сериализации и извлечении значения

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

  • числовой формат
  • строковый формат
  • формат с символами валют

Даже если глобальные настройки изменены после инициализации, извлечение значения учитывает локальный контекст экземпляра.

an.getNumber(); // учитывает локальные правила округления
an.getFormatted(); // учитывает локальные символы и разделители