Не могу найти информацию о вызове методов компонента. Нашел описание декларации реакций на состояния, но не могу найти примера отправки управляющего сообщения или вызова метода.
Тут говорится о БЭМ-событиях
https://ru.bem.info/technologies/classic/i-bem/events/Вы через них отправляете запросы компонентам?
Я только хочу понять как это принято делать. Не в конкретной реализации, а на алгоритмическом уровне.
Сейчас представляю для себя такие варианты:
1. При загрузке страницы инициирую объект, в который складываю все элементы с задекларироваными классами. Декларация представляет собой имя класса и карту его методов
bemManager.decl({class: 'menu', methodList:{clearInput: e=>{...}}}). Для вызова метода, передаю элемент (компонент) в менеджер, получаю карту методов и вызываю нужный условно
var menu = bemManager.get(menuElm); menu.clearInput(). Декларация поставляется с компонентом и методы (например clearInput) содержат взаимодействие с элементом.
У этого подхода такие недостатки: зависимость от фреймворка, фреймворк обязан следить за обновлением DOM и модифицировать свой список объектов.
2. Для вызова метода, пушу кастомное событие документу
CustomEvent('bem-menu', {details: {target: menuElm, action: 'clearInput'}}), все компоненты menu прослушивают это сообщение и делают проверку на то к ним ли это обращение (сравнивают target с собой) и если да, то выполняют метод, если это корректное имя.
Недостатки такие: использование событий для обмена сообщениями, для управления, а не для сообщения о каких-то дейсвиях. Невозможность получения прямого ответа на запрос (хотя можно например передавать коллбэк, который будет выполнять компонент при обработке, но если обрабатывать некому, то и коллбэк вызван не будет)
---
На сколько такие способы взаимодействия близки к эталонной реализации? Первый - это примерно то, что и реализует i-bem? Если нет или не совсем, то опишите схематично, как вы вызываете методы сейчас.
Я правда посмотрел документацию и не нашел пункта, где об этом подробно рассказывается, если он есть - дайте ссылку с якорем.