Сразу видел 4 варианта решения.
- В одном "классе" реализизовать всю логику. С одной стороны все под рукой, с другой нету разделения обязанностей и тяжелее вносить изменения при расширении или рефакторинге.
- MVC - где M & V - тупые, все решает C. Выбрал его, так как, наверно ближе с момента работы на бэке и так же из за того что до сих пор работаю с Marionette.
- MVVM - сегодня для себя уточнил особенности данного патерна, но пробовать делать наброски думаю пока рано.
- 2-й вариинт, но с большим количеством классов и наследованием, можно было бы сделать базовый класс, с созданием ноды, подвязыванием и отвязыванием ивентов извне. Наследуюясь от него создать отдельно классы input, autocomliteList, label, loader (spinner) у которых уже была бы реализация как своей доп логики так и доработка существующих методов, как создание ноды. Отдельно сделать фабрику, которая в зависимости от входящих данных создавала нужный метод onAutocomliteChange.