Zachowania Drupala związane z przywiązaniem: reagujesz na wszystkie nowo ładowane treści?

12

Mam dwa różne moduły, które pod wieloma względami współpracują ze sobą. Jedną z rzeczy, nad którymi wspólnie pracują, jest to, że moduł A ładuje zawartość przez AJAX, a moduł B musi dołączyć detektory zdarzeń do ładowanej treści.

Wydaje się jednak, że gdy zawartość jest ładowana przez AJAX przez moduł A, wywoływana jest tylko funkcja „attach” z Drupal.behaviours.a , a nie funkcja „attach” z Drupal.behaviours.b . Obie funkcje są wywoływane przy ładowaniu strony, ale nie przy kolejnym ładowaniu treści 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');
  }
}    

Jak ustawić funkcję „dołącz” w pliku Drupal.behaviours.b za każdym razem, gdy dowolny moduł ładuje nową zawartość?

sbrattla
źródło
Czy próbowałeś dodać Drupal.attachBehaviors();do wywołania zwrotnego ajax?
Clive
Nie, ale czy to nie powinno być załatwione automatycznie? Myślałem, że to jest cała idea funkcji „dołącz”; że powinno się to wywoływać przy ładowaniu strony i aktualizacji strony? Wydaje się jednak, że tylko funkcja „dołącz” dla modułu wywołującego jest wywoływana podczas aktualizacji strony?
sbrattla
To było moje zrozumienie, tak, nigdy jednak nie zagłębiałem się w to zbyt głęboko. Wiem, że były chwile, kiedy po wywołaniu AJAX musiałem przywrócić zachowania, więc po prostu założyłem, że jest to wymagane
Clive
Patrząc na drupal.js: „Drupal.attachBehaviors jest dodawany poniżej do zdarzenia jQuery ready i dlatego działa przy początkowym ładowaniu strony. Programiści implementujący AHAH / Ajax w swoich rozwiązaniach powinni również wywołać tę funkcję po załadowaniu nowej zawartości strony, wprowadzając element do przetworzenia w celu dołączenia wszystkich zachowań do nowej treści. ” Wygląda na to, że muszę samodzielnie przywołać attaché Behaviours. Ale; zastanawia mnie, że funkcja „dołączania” modułu A działa, mimo że nie wywołałem attachBehaviours w wywołaniu zwrotnym sukcesu AJAX ...? Dlaczego tylko dla modułu wywołującego, a nie dla wszystkich modułów?
sbrattla
1
Jeśli chcesz zastosować rozwiązanie typu catch-all $('body').ajaxSuccess(Drupal.attachBehaviors);, prawdopodobnie zadziała
Clive

Odpowiedzi:

4

To, na podstawie komentarzy w misc/drupal.js, wyjaśnia, jak to powinno działać:

  • Drupal.attachBehaviors został dodany poniżej do zdarzenia jQuery ready i tak dalej
  • działa przy początkowym ładowaniu strony. Programiści wdrażający AHAH / Ajax w swoich
  • rozwiązania powinny także wywoływać tę funkcję po nowej zawartości strony
  • załadowany, zasilający element do przetworzenia, w celu dołączenia wszystkich
  • zachowania wobec nowej treści.
lazysoundsystem
źródło
2

Spróbuj dodać to w Drupal.behavior.b:

Drupal.attachBehaviors($(this));
Nanak
źródło