Drupals Verhalten beim Anhängen: Auf alle neu geladenen Inhalte reagieren?

12

Ich habe zwei verschiedene Module, die in vielerlei Hinsicht zusammenarbeiten. Sie arbeiten unter anderem daran, dass Modul A Inhalte über AJAX lädt und Modul B Ereignis-Listener an die geladenen Inhalte anfügt.

Es scheint jedoch, dass beim Laden von Inhalten über AJAX durch Modul A nur die Funktion "Anhängen" von Drupal.behaviours.a aufgerufen wird und nicht die Funktion "Anhängen" von Drupal.behaviours.b . Beide Funktionen werden beim Laden einer Seite aufgerufen, jedoch nicht beim anschließenden Laden von AJAX-Inhalten.

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

Wie kann ich die Funktion "Anhängen" von Drupal.behaviours.b jedes Mal ausführen lassen, wenn ein Modul neuen Inhalt lädt?

sbrattla
quelle
Haben Sie versucht Drupal.attachBehaviors();, den Ajax Success Callback zu ergänzen?
Clive
Nein, aber sollte das nicht automatisch erledigt werden? Ich dachte, das wäre die ganze Idee der Funktion "Anhängen". dass es beim Seitenladen und Seitenupdate aufgerufen werden soll? Es scheint jedoch, dass nur die Funktion "Anhängen" für das aufrufende Modul bei der Seitenaktualisierung aufgerufen wird.
Sbrattla
Das war mein Verständnis, ja, ich habe mir das aber noch nie so genau angesehen. Ich weiß, dass es Zeiten gab, in denen ich nach einem AJAX-Aufruf Verhaltensweisen neu zuordnen musste, also habe ich einfach angenommen, dass dies erforderlich war
Clive
Betrachtet man drupal.js: "Drupal.attachBehaviors wird dem jQuery ready - Ereignis unten hinzugefügt und wird daher beim ersten Laden der Seite ausgeführt. Entwickler, die AHAH / Ajax in ihre Lösungen implementieren, sollten diese Funktion auch aufrufen, nachdem neuer Seiteninhalt geladen wurde, und eine neue Seite einfügen zu verarbeitendes Element, um alle Verhaltensweisen an den neuen Inhalt anzuhängen. " Es scheint, dass ich das attachBehaviours selbst aufrufen muss. Aber; Es ist mir ein Rätsel, dass die Funktion "Anhängen" von Modul A ausgeführt wird, obwohl ich "attachBehaviours" im AJAX-Erfolgsrückruf nicht aufgerufen habe ...? Warum nur für das aufrufende Modul und nicht für alle Module?
Sbrattla
1
Wenn Sie eine Allround-Lösung wollen, $('body').ajaxSuccess(Drupal.attachBehaviors);wird dies wahrscheinlich funktionieren
Clive

Antworten:

4

Aus den Kommentaren in misc/drupal.jsgeht hervor, wie es funktionieren soll:

  • Drupal.attachBehaviors wird unten zum jQuery ready-Ereignis hinzugefügt und so weiter
  • Läuft beim ersten Laden der Seite. Entwickler, die AHAH / Ajax in ihren
  • lösungen sollten diese funktion auch aufrufen, wenn neue seiteninhalte vorliegen
  • geladen, füttert ein zu bearbeitendes Element ein, um alle zu befestigen
  • Verhalten zum neuen Inhalt.
lazysoundsystem
quelle
2

Versuchen Sie, dies in Drupal.behavior.b hinzuzufügen:

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