I comportamenti allegati di Drupal: reagire su tutti i contenuti appena caricati?


12

Ho due moduli diversi che in molti modi lavorano insieme. Una delle cose su cui lavorano insieme è che il modulo A carica il contenuto tramite AJAX e il modulo B deve collegare listener di eventi al contenuto caricato.

Tuttavia, sembra che quando il contenuto viene caricato tramite AJAX dal modulo A, viene invocata solo la funzione 'attach' di Drupal.behaviours.a e non la funzione 'attach' di Drupal.behaviours.b . Entrambe le funzioni vengono invocate al caricamento della pagina, ma non al successivo caricamento del contenuto 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');
  }
}    

Come faccio a far funzionare la funzione 'attach' di Drupal.behaviours.b ogni volta che un modulo carica nuovi contenuti?


Hai provato ad aggiungere Drupal.attachBehaviors();al callback di successo Ajax?
Clive

No, ma questo non dovrebbe essere curato automaticamente? Ho pensato che fosse l'intera idea della funzione 'attach'; che dovrebbe essere chiamato al caricamento della pagina e all'aggiornamento della pagina? Tuttavia, sembra che solo la funzione 'attach' per il modulo che invoca venga chiamata sull'aggiornamento della pagina?
sbrattla,

Questa è stata la mia comprensione sì, non l'ho mai esaminato troppo profondamente però. So che ci sono stati momenti in cui dopo una chiamata AJAX ho dovuto ricollegare i comportamenti, quindi ho solo pensato che fosse necessario
Clive

Guardando drupal.js: "Drupal.attachBehaviors viene aggiunto di seguito all'evento jQuery pronto e quindi viene eseguito sul caricamento della pagina iniziale. Gli sviluppatori che implementano AHAH / Ajax nelle loro soluzioni dovrebbero anche chiamare questa funzione dopo che il nuovo contenuto della pagina è stato caricato, inserendo un elemento da elaborare, al fine di associare tutti i comportamenti al nuovo contenuto. " Sembra che io abbia bisogno di invocare me stesso i attachBehaviours. Ma; mi confonde il fatto che la funzione 'attach' del modulo A funzioni anche se non ho invocato attachBehaviours nel callback di successo di AJAX ...? Perché solo per il modulo che invoca e non tutti i moduli?
sbrattla,

1
Se vuoi una soluzione a tutto campo $('body').ajaxSuccess(Drupal.attachBehaviors);probabilmente funzionerà
Clive

Risposte:


4

Questo, dai commenti in misc/drupal.js, spiega come dovrebbe funzionare:

  • Drupal.attachBehaviors viene aggiunto di seguito all'evento jQuery ready e così
  • viene eseguito al caricamento della pagina iniziale. Gli sviluppatori che implementano AHAH / Ajax nel loro
  • le soluzioni dovrebbero anche chiamare questa funzione dopo che il contenuto della nuova pagina è stato
  • caricato, inserendo un elemento da elaborare, al fine di allegare tutto
  • comportamenti al nuovo contenuto.

2

Prova ad aggiungere questo in Drupal.behavior.b:

Drupal.attachBehaviors($(this));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.