Поведение присоединения Drupal: реагировать на весь недавно загруженный контент?

12

У меня есть два разных модуля, которые во многом работают вместе. Одна из вещей, над которыми они работают вместе, заключается в том, что модуль A загружает контент через AJAX, а модуль B должен подключать прослушиватели событий к загруженному контенту.

Однако кажется, что когда контент загружается через AJAX модулем A, вызывается только функция «attach» в Drupal.behaviours.a , а не функция «attach» в Drupal.behaviours.b . Обе функции вызываются при загрузке страницы, но не при последующей загрузке содержимого AJAX.

// This runs every time module A loads new content.
Drupal.behaviors.a = {
  attach: function(context, settings) {
    alert('a:attach');
  }
}

// This only runs on page load, but never when module A loads new content.
Drupal.behaviors.b = {
  attach: function(context, settings) {
    alert('b:attach');
  }
}    

Как сделать так, чтобы функция присоединения в Drupal.behaviours.b запускалась каждый раз, когда какой-либо модуль загружает новый контент?

sbrattla
источник
Вы пытались добавить Drupal.attachBehaviors();к успешному обратному вызову ajax?
Клайв
Нет, но не следует ли об этом позаботиться автоматически? Я думал, что это была вся идея функции присоединения; что это должно быть вызвано при загрузке страницы и обновлении страницы? Кажется, однако, что только функция 'attach' для вызывающего модуля вызывается при обновлении страницы?
sbrattla
Это было мое понимание, да, я никогда не углублялся в это, хотя. Я знаю, что были случаи, когда после AJAX-вызова мне нужно было повторно подключать поведение, поэтому я просто предположил, что это необходимо
Клайв
Глядя на drupal.js: «Drupal.attachBehaviors добавляется ниже к событию готовности jQuery и запускается при начальной загрузке страницы. Разработчики, внедряющие AHAH / Ajax в свои решения, должны также вызывать эту функцию после загрузки нового содержимого страницы, подавая в элемент для обработки, чтобы прикрепить все поведения к новому контенту. " Кажется, мне нужно самому вызывать attachBehaviours. Но; меня удивляет, что функция присоединения модуля A запускается, даже если я не вызывал attachBehaviours в обратном вызове AJAX success ...? Почему только для вызывающего модуля, а не для всех модулей?
sbrattla
1
Если вы хотите, чтобы всеохватывающее решение $('body').ajaxSuccess(Drupal.attachBehaviors);, вероятно, сработало
Клайв

Ответы:

4

Это, из комментариев misc/drupal.js, объясняет, как это должно работать:

  • Drupal.attachBehaviors добавляется ниже в событие готовности jQuery и так
  • работает при начальной загрузке страницы. Разработчики, внедряющие AHAH / Ajax в свои
  • Решения также должны вызывать эту функцию после того, как новый контент страницы был
  • загружен, подает элемент для обработки, чтобы прикрепить все
  • поведения к новому контенту.
lazysoundsystem
источник
2

Попробуйте добавить это в Drupal.behavior.b:

Drupal.attachBehaviors($(this));
Нанак
источник