Comportamientos adjuntos de Drupal: ¿reaccionar ante todo el contenido recién cargado?

12

Tengo dos módulos diferentes que, en muchos sentidos, funcionan juntos. Una de las cosas en las que trabajan juntos es que el módulo A carga contenido a través de AJAX, y el módulo B necesita adjuntar oyentes de eventos al contenido cargado.

Sin embargo, parece que cuando el módulo A carga contenido a través de AJAX, solo se invoca la función 'adjuntar' de Drupal.behaviours.a , y no la función 'adjuntar' de Drupal.behaviours.b . Ambas funciones se invocan en la carga de la página, pero no en la carga de contenido AJAX posterior.

// 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');
  }
}    

¿Cómo hago que la función 'adjuntar' de Drupal.behaviours.b se ejecute cada vez que un módulo carga contenido nuevo?

sbrattla
fuente
¿Has intentado agregar Drupal.attachBehaviors();a la devolución de llamada de éxito ajax?
Clive
No, pero ¿eso no debería resolverse automáticamente? Pensé que esa era la idea de la función 'adjuntar'; que debería llamarse en la carga y actualización de la página? Sin embargo, ¿parece que solo se llama a la función 'adjuntar' para el módulo de invocación en la actualización de la página?
sbrattla
Eso entendí, sí, aunque nunca lo he investigado demasiado. Sé que hubo momentos en que después de una llamada AJAX tuve que volver a conectar los comportamientos, así que supuse que era necesario
Clive
Examinando drupal.js: "Drupal.attachBehaviors se agrega a continuación al evento jQuery ready y, por lo tanto, se ejecuta en la carga de la página inicial. Los desarrolladores que implementen AHAH / Ajax en sus soluciones también deben llamar a esta función después de cargar el nuevo contenido de la página, introduciéndose en un elemento a procesar, para adjuntar todos los comportamientos al nuevo contenido ". Parece que necesito invocar el attachBehaviours yo mismo. Pero; me desconcierta que la función 'adjuntar' del módulo A se ejecute a pesar de que no he invocado attachBehaviours en la devolución de llamada de éxito de AJAX ...? ¿Por qué solo para el módulo de invocación, y no todos los módulos?
sbrattla
1
Si desea una solución general $('body').ajaxSuccess(Drupal.attachBehaviors);, probablemente funcionará
Clive

Respuestas:

4

Esto, a partir de los comentarios en misc/drupal.js, explica cómo se supone que debe funcionar:

  • Drupal.attachBehaviors se agrega a continuación al evento jQuery ready y así
  • se ejecuta en la carga de la página inicial. Desarrolladores que implementan AHAH / Ajax en su
  • las soluciones también deberían llamar a esta función después de que se haya contenido la nueva página
  • cargado, alimentando en un elemento a procesar, para adjuntar todo
  • comportamientos ante el nuevo contenido.
sistema perezoso
fuente
2

Intente agregar esto en Drupal.behavior.b:

Drupal.attachBehaviors($(this));
Nanak
fuente