Mind.js предоставляет гибкий механизм для обработки пользовательских действий, обеспечивая возможность связывать события интерфейса с логикой нейронной сети. Обработчик пользовательских действий — это функция, которая вызывается при возникновении определённого события, такого как клик мыши, изменение поля ввода или выполнение произвольного триггера.
Структура обработчика определяется стандартным интерфейсом:
function handler(event, state) {
// event — объект события
// state — текущие данные модели Mind.js
}
event содержит сведения о типе события, источнике и
дополнительных параметрах, а state предоставляет доступ к
внутреннему состоянию сети и хранилищу данных.
Для привязки обработчика к элементу или событию используется метод
addActionHandler:
mind.addActionHandler("click", "button#start", function(event, state) {
state.network.activate([1, 0, 0]);
});
Параметры метода:
"click", "input", "hover".Можно привязывать несколько обработчиков к одному элементу и событию, что позволяет создавать сложные цепочки реакций без изменения исходного кода нейронной сети.
Обработчики получают объект состояния, который содержит следующие ключевые поля:
network — экземпляр нейронной сети Mind.js;data — текущее состояние данных модели;params — пользовательские параметры для передачи в
обработчик;lastEvent — информация о предыдущем событии.Это позволяет сохранять состояние между вызовами и использовать предыдущие результаты для вычислений.
Пример использования состояния для обновления данных сети:
mind.addActionHandler("input", "input#userText", function(event, state) {
state.data.userInput = event.target.value;
state.network.activate([event.target.value.length / 10]);
});
Mind.js поддерживает асинхронное выполнение функций, что полезно при запросах к внешним API или длительных вычислениях. Обработчик может возвращать промис:
mind.addActionHandler("click", "#fetchData", async (event, state) => {
const response = await fetch("/api/data");
const result = await response.json();
state.data.apiResult = result;
state.network.activate([result.value]);
});
Асинхронные обработчики не блокируют основной поток и позволяют плавно интегрировать нейросетевую логику с внешними источниками данных.
Можно создавать обработчики, которые срабатывают только при выполнении определённого условия:
mind.addActionHandler("click", "#submitButton", function(event, state) {
if (state.data.userInput && state.data.userInput.length > 3) {
state.network.activate([1]);
}
});
Это позволяет реализовывать контролируемые действия, где реакция сети зависит от состояния данных или контекста интерфейса.
Mind.js позволяет задавать приоритет обработчиков через опциональный параметр:
mind.addActionHandler("click", "#start", handler, { priority: 10 });
Это важно при построении сложных взаимодействий, когда одни события зависят от результатов других.
Для управления жизненным циклом событий используется метод
removeActionHandler:
mind.removeActionHandler("click", "#start", handler);
Можно удалять отдельные обработчики или все обработчики для конкретного события и элемента. Это предотвращает утечки памяти и дублирование срабатываний при динамическом создании элементов интерфейса.
Обработчики можно объединять в последовательности, чтобы создавать сценарии с несколькими этапами:
mind.addActionHandler("click", "#step1", function(event, state) {
state.data.step1Complete = true;
});
mind.addActionHandler("click", "#step2", function(event, state) {
if (state.data.step1Complete) {
state.network.activate([0, 1]);
}
});
Таким образом обеспечивается поэтапная активация сети на основе действий пользователя.
Mind.js содержит вспомогательные методы для упрощения работы с событиями:
getEventTarget(event) — получение DOM-элемента,
вызвавшего событие;preventDefault(event) — отмена стандартного поведения
элемента;stopPropagation(event) — остановка распространения
события.Использование этих утилит повышает читаемость и надёжность обработчиков.