@namee

Как вызвать выполнение функции JS в drupal 10 через ajax?

Доброго дня!
Есть некая форма реализующая ajax интерфейс с фрагментом кода
public function ajaxCallback(array &$form, FormStateInterface $form_state)
  {
      $response = new AjaxResponse();
      $response->addCommand(new InvokeCommand('document', 'sendMessage', ['test']));
      return $response;
  }


есть подключенный фрагмент JS, который создаёт вызываемую функцию
(function ($, Drupal, drupalSettings) {

  $(document).ready(function(){

    $(document).bind('sendMessage', function(msg) {
      alert('MY_EVENT');
    });

  });

})(jQuery, Drupal, drupalSettings);


функция точно создаётся. Точка останова на ней срабатывает.
Но вот при попытке вызвать её с помощью ajax возникает ошибка
Произошла ошибка во время выполнения ответа Ajax: TypeError: $element[response.method] is not a function


Складываеся впечатление, что вызов происходит в другой области видимости.
Пробовал addClass вызывать у одного из объектов - срабатывает отлично.
Подключат этому объектку функцию, не видит её.

Который день бьюсь. Объясните, пожалуйста. Как объявить функцию так, чтобы drupal AJAX её увидел?
  • Вопрос задан
  • 63 просмотра
Решения вопроса 2
andead
@andead
друпал девелопер, фрилансер
Написать свою ajax команду, которая будет вызывать функции. InvokeCommand на вход принимает селектор, а 'document' это не селектор.
Ответ написан
Комментировать
@namee Автор вопроса
Всем большое спасибо. Помогли кастомные комманды.
https://weknowinc.com/blog/technical-articles/crea...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
IvanU7n
@IvanU7n
nothing interesting here
Как объявить функцию так, чтобы drupal AJAX её увидел?

ИМНИП никак: у Drupal-а нет команды для вызова произвольных функций, а вызываемая — для выполнения методов jQuery; да и приведённый код на стороне jQuery — не объявление ни функции, ни метода

на галлюцинациях о разных областях видимости останавливаться не буду, т.к. вдумчивое прочтение документации приводит к просветлению

а чтобы вся эта система хоть как-то заработала, команда должна выглядеть как-то так:
new InvokeCommand('document', 'trigger', [ 'sendMessage', 'test', ])

а обработчик события как-то так:
function(e, msg) {
  alert('MY_EVENT');
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы