Групповые операции в AutoNumeric позволяют управлять несколькими числовыми полями одновременно. Вместо последовательной обработки каждого экземпляра вручную библиотека предоставляет механизмы синхронного обновления, форматирования, очистки, изменения настроек и получения данных сразу у целого набора элементов.
Такой подход особенно важен в следующих сценариях:
Групповая обработка снижает количество повторяющегося кода и упрощает поддержку интерфейсов с большим количеством числовых компонентов.
После инициализации каждый элемент получает собственный экземпляр AutoNumeric.
const price = new AutoNumeric('#price');
const tax = new AutoNumeric('#tax');
const total = new AutoNumeric('#total');
При большом количестве полей экземпляры обычно объединяют в массив:
const fields = [
new AutoNumeric('#price'),
new AutoNumeric('#tax'),
new AutoNumeric('#discount'),
new AutoNumeric('#total')
];
Теперь все элементы можно обрабатывать централизованно.
Наиболее распространённый вариант — перебор массива экземпляров.
fields.forEach(field => {
field.set(0);
});
Все поля будут сброшены к нулю с автоматическим форматированием.
fields.forEach(field => {
field.set('1000');
});
Результат зависит от настроек форматирования каждого экземпляра:
1 000,00 €
$1,000.00
1000.000
Хотя значение одинаковое, визуальное представление определяется локальными параметрами поля.
const formattedValues = fields.map(field => {
return field.getFormatted();
});
console.log(formattedValues);
Результат:
[
'1 200,00',
'500,00',
'300,00',
'1 400,00'
]
const numericValues = fields.map(field => {
return field.getNumber();
});
console.log(numericValues);
Результат:
[
1200,
500,
300,
1400
]
const rawValues = fields.map(field => {
return field.getNumericString();
});
Результат:
[
'1200',
'500',
'300',
'1400'
]
Одним из главных преимуществ групповых операций является централизованная смена конфигурации.
fields.forEach(field => {
field.update({
currencySymbol: '$',
currencySymbolPlacement: 'p'
});
});
Все элементы мгновенно обновят формат отображения.
fields.forEach(field => {
field.update({
digitGroupSeparator: '.',
decimalCharacter: ','
});
});
До обновления:
1,234.56
После обновления:
1.234,56
fields.forEach(field => {
field.update({
decimalPlaces: 4
});
});
Теперь все поля будут отображать:
100.0000
Часто элементы инициализируются через единый селектор.
new AutoNumeric.multiple('.money', {
currencySymbol: '€ ',
decimalPlaces: 2
});
Все элементы с классом .money автоматически получают
экземпляры AutoNumeric.
Метод AutoNumeric.multiple() предназначен для массовой
инициализации набора элементов.
AutoNumeric.multiple(selector, options);
<input class="price">
<input class="price">
<input class="price">
AutoNumeric.multiple('.price', {
decimalCharacter: ',',
digitGroupSeparator: ' '
});
Метод возвращает массив экземпляров AutoNumeric.
const instances = AutoNumeric.multiple('.price', {
currencySymbol: '$'
});
Теперь можно выполнять групповые операции:
instances.forEach(instance => {
instance.set(500);
});
const elements = document.querySelectorAll('.amount');
const instances = AutoNumeric.multiple(elements, {
decimalPlaces: 2
});
Это особенно удобно при динамическом DOM.
Иногда требуется общая база настроек с локальными переопределениями.
const baseOptions = {
digitGroupSeparator: ' ',
decimalCharacter: ','
};
const salary = new AutoNumeric('#salary', {
...baseOptions,
currencySymbol: '₸ '
});
const bonus = new AutoNumeric('#bonus', {
...baseOptions,
currencySymbol: '$ '
});
Такой подход позволяет сохранить единообразие поведения.
fields.forEach(field => {
field.clear();
});
Все значения будут удалены.
fields.forEach(field => {
field.set(null);
});
Поведение зависит от параметров:
emptyInputBehavior
fields.forEach(field => {
field.node().disabled = true;
});
fields.forEach(field => {
field.node().disabled = false;
});
fields.forEach(field => {
field.remove();
});
После вызова:
const input = document.createElement('input');
input.classList.add('money');
document.body.appendChild(input);
const anElement = new AutoNumeric(input, {
currencySymbol: '€ '
});
При динамическом интерфейсе иногда требуется повторный запуск:
AutoNumeric.multiple('.money', {
currencySymbol: '€ '
});
Но важно избегать повторной инициализации уже существующих экземпляров.
const existing = AutoNumeric.getAutoNumericElement(input);
Если экземпляр уже существует:
if (!existing) {
new AutoNumeric(input);
}
const source = new AutoNumeric('#source');
fields.forEach(field => {
field.set(source.getNumericString());
});
const total = fields.reduce((sum, field) => {
return sum + Number(field.getNumericString());
}, 0);
console.log(total);
fields.forEach(field => {
field.node().addEventListener('autoNumeric:rawValueModified', () => {
recalculate();
});
});
function recalculate() {
const total = fields.reduce((sum, field) => {
return sum + Number(field.getNumericString());
}, 0);
totalField.set(total);
}
fields.forEach(field => {
field.update({
currencySymbol: ''
});
});
fields.forEach(field => {
field.update({
currencySymbol: '₸ '
});
});
fields.forEach(field => {
field.update({
decimalPlaces: 0
});
});
Все значения станут целыми:
1 500
25
10000
При наличии десятков или сотен полей рекомендуется:
const groups = new Map();
groups.se t('prices', [
new AutoNumeric('#price1'),
new AutoNumeric('#price2')
]);
groups.set('taxes', [
new AutoNumeric('#tax1'),
new AutoNumeric('#tax2')
]);
groups.get('prices').forEach(field => {
field.update({
currencySymbol: '$ '
});
});
const invalidFields = fields.filter(field => {
return field.getNumber() < 0;
});
invalidFields.forEach(field => {
field.node().classList.add('error');
});
const payload = fields.map(field => {
return {
value: field.getNumericString()
};
});
console.log(JSON.stringify(payload));
При удалении контейнера желательно предварительно уничтожать экземпляры:
fields.forEach(field => {
field.remove();
});
container.remove();
Это предотвращает:
В крупных приложениях часто создаётся централизованный менеджер.
class NumericGroupManager {
constructor(instances = []) {
this.instances = instances;
}
setAll(value) {
this.instances.forEach(i => i.set(value));
}
clearAll() {
this.instances.forEach(i => i.clear());
}
updateAll(options) {
this.instances.forEach(i => i.update(options));
}
getTotal() {
return this.instances.reduce((sum, i) => {
return sum + Number(i.getNumericString());
}, 0);
}
}
const manager = new NumericGroupManager([
new AutoNumeric('#a'),
new AutoNumeric('#b'),
new AutoNumeric('#c')
]);
manager.setAll(100);
console.log(manager.getTotal());
Наиболее затратными являются:
Для оптимизации применяются:
AutoNumeric.multiple('.money');
AutoNumeric.multiple('.money');
Это может привести к конфликтам экземпляров.
Ошибка:
field.set(field.getFormatted());
Правильнее:
field.set(field.getNumericString());
Ошибка:
AutoNumeric.multiple('.money');
Без сохранения результата дальнейшее управление становится затруднительным.
Правильно:
const moneyFields = AutoNumeric.multiple('.money');