При работе с большим количеством полей ввода часто возникает необходимость массово уничтожать экземпляры AutoNumeric. Особенно это важно в динамических интерфейсах:
В AutoNumeric для подобных задач используются групповые операции удаления. Они позволяют безопасно уничтожать несколько экземпляров одновременно, корректно снимая:
При наличии множества экземпляров попытка удалять каждый объект вручную быстро приводит к громоздкому коду.
Пример ручного уничтожения:
an1.remove();
an2.remove();
an3.remove();
an4.remove();
При динамическом интерфейсе такой подход становится неудобным:
const rows = document.querySelectorAll('.price');
rows.forEach(element => {
AutoNumeric.getAutoNumericElement(element).remove();
});
Кроме избыточности появляется риск:
AutoNumeric предоставляет механизм групповых операций через
AutoNumeric.multiple().
Пример:
const elements = document.querySelectorAll('.money');
const group = AutoNumeric.multiple(elements, {
currencySymbol: '₸ ',
digitGroupSeparator: ' '
});
Метод возвращает специальный массив экземпляров AutoNumeric.
Каждый элемент массива — полноценный объект AutoNumeric:
group[0].set(1000);
group[1].set(2000);
Но дополнительно группа получает методы массовых операций.
Для уничтожения всех экземпляров используется:
group.remove();
После вызова:
AutoNumeric регистрирует множество событий:
input;keydown;keyup;focus;blur;wheel;paste;drop.Во время удаления экземпляра библиотека снимает все привязки.
Без корректного удаления могут появляться:
AutoNumeric хранит:
При remove() эти структуры уничтожаются.
До удаления:
<input value="1 234 ₸">
После:
<input value="1234">
Форматирование исчезает.
Поле перестаёт быть AutoNumeric-экземпляром.
Типичный сценарий:
<tr class="row">
<td><input class="price"></td>
<td><button class="remove">Удалить</button></td>
</tr>
Инициализация:
const autoNumericGroup = AutoNumeric.multiple('.price', {
currencySymbol: '$'
});
Удаление:
document.querySelector('.remove-all')
.addEventListener('click', () => {
autoNumericGroup.remove();
});
При закрытии модального окна желательно уничтожать экземпляры.
function destroyModal() {
modalGroup.remove();
modal.remove();
}
Это предотвращает накопление скрытых обработчиков.
Во фреймворках:
неуничтоженные экземпляры становятся причиной утечек памяти.
Правильный жизненный цикл:
const group = AutoNumeric.multiple(inputs);
component.onDestroy(() => {
group.remove();
});
После:
group.remove();
сам массив ещё существует:
console.log(group);
Но его элементы больше не являются активными экземплярами AutoNumeric.
Нельзя:
group.set(100);
после удаления.
Это приведёт к ошибкам или некорректной работе.
После уничтожения необходимо создавать новую группу.
Можно удалить конкретный экземпляр:
group[2].remove();
Остальные элементы продолжат работать.
Иногда требуется уничтожить только часть группы:
group.forEach((instance, index) => {
if (index % 2 === 0) {
instance.remove();
}
});
Удаление часто сопровождается повторным созданием.
let group = AutoNumeric.multiple('.amount');
group.remove();
group = AutoNumeric.multiple('.amount');
Удаление удобно использовать перед полной сменой настроек.
Было:
AutoNumeric.multiple('.money', {
currencySymbol: '$'
});
Стало:
group.remove();
group = AutoNumeric.multiple('.money', {
currencySymbol: '€'
});
Ошибка:
element.remove();
без уничтожения AutoNumeric.
Проблемы:
Сначала:
instance.remove();
Потом:
element.remove();
Для группы:
group.remove();
container.remove();
Если группа заранее не сохранена, можно удалять экземпляры вручную.
document.querySelectorAll('.price')
.forEach(element => {
const anElement =
AutoNumeric.getAutoNumericElement(element);
if (anElement) {
anElement.remove();
}
});
Перед удалением полезно проверять наличие объекта.
const an = AutoNumeric.getAutoNumericElement(input);
if (an !== null) {
an.remove();
}
Это особенно важно при сложных SPA-интерфейсах.
После уничтожения:
Поле становится обычным DOM-элементом.
Если пользовательские обработчики зависели от AutoNumeric-событий:
input.addEventListener('autoNumeric:rawValueModified', fn);
то после удаления они больше не будут вызываться.
Сервер возвращает новый HTML:
container.innerHTML = html;
Старые экземпляры AutoNumeric остаются в памяти.
group.remove();
container.innerHTML = html;
group = AutoNumeric.multiple('.money');
Клонирование DOM-узлов с активным AutoNumeric:
const clone = node.cloneNode(true);
может переносить некорректное состояние.
group.remove();
const clone = node.cloneNode(true);
После клонирования:
AutoNumeric.multiple(clone.querySelectorAll('.money'));
const instances = document.querySelectorAll('.currency');
const group = AutoNumeric.multiple(instances);
group.remove();
function destroyTemporaryFields() {
const tempInputs =
document.querySelectorAll('.temporary-money');
AutoNumeric
.multiple(tempInputs)
.remove();
}
Групповое удаление:
group.remove();
обычно эффективнее большого количества разрозненных операций.
Причины:
При наличии сотен полей:
AutoNumeric.multiple('.financial-input');
правильное удаление критически важно.
Без этого:
После:
instance.remove();
значение поля остаётся.
Но оно уже не форматируется автоматически.
До удаления:
<input value="$1,500.00">
После:
<input value="1500">
const formGroup = AutoNumeric.multiple(
form.querySelectorAll('.numeric')
);
formGroup.remove();
form.remove();
formGroup.remove();
form.innerHTML = template;
formGroup = AutoNumeric.multiple(
form.querySelectorAll('.numeric')
);
Неправильно:
container.innerHTML = '';
Правильно:
group.remove();
container.innerHTML = '';
Ошибка:
group.remove();
group.set(100);
Некоторые разработчики вызывают:
group.remove();
group.remove();
Поведение может зависеть от версии библиотеки.
Лучше после удаления обнулять ссылку:
group.remove();
group = null;
let group = AutoNumeric.multiple('.amount', {
currencySymbol: '₽ '
});
function destroy() {
if (group) {
group.remove();
group = null;
}
}
В крупных приложениях удобно хранить группы отдельно:
const numericGroups = {
prices: AutoNumeric.multiple('.price'),
taxes: AutoNumeric.multiple('.tax'),
totals: AutoNumeric.multiple('.total')
};
Удаление:
Object.values(numericGroups)
.forEach(group => group.remove());
class NumericManager {
constructor(selector, options) {
this.group =
AutoNumeric.multiple(selector, options);
}
destroy() {
if (this.group) {
this.group.remove();
this.group = null;
}
}
}
Такой подход особенно полезен в сложных интерфейсах с большим количеством динамических компонентов.