Perilaku melampirkan Drupal: bereaksi terhadap semua konten yang baru dimuat?

12

Saya punya dua modul berbeda yang dalam banyak hal bekerja bersama. Salah satu hal yang mereka kerjakan bersama adalah modul A memuat konten melalui AJAX, dan modul B perlu melampirkan pendengar acara ke konten yang dimuat.

Namun, tampak bahwa ketika konten dimuat melalui AJAX oleh modul A, hanya fungsi 'attach' dari Drupal.behaviours.a dipanggil, dan bukan fungsi 'attach' dari Drupal.behaviours.b . Kedua fungsi dipanggil pada pemuatan halaman, tetapi tidak pada pemuatan konten AJAX berikutnya.

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

Bagaimana cara saya membuat fungsi 'attach' dari Drupal.behaviours.b dijalankan setiap kali modul memuat konten baru?

sbrattla
sumber
Sudahkah Anda mencoba menambah Drupal.attachBehaviors();callback keberhasilan ajax?
Clive
Tidak, tetapi haruskah itu tidak ditangani secara otomatis? Saya pikir itu adalah seluruh ide fungsi 'lampirkan'; bahwa itu harus dipanggil saat memuat halaman dan pembaruan halaman? Namun, tampaknya hanya fungsi 'lampirkan' untuk modul pemanggilan yang dipanggil pada pembaruan halaman?
sbrattla
Itu pemahaman saya ya, saya belum pernah melihatnya terlalu dalam sekalipun. Saya tahu ada saat-saat ketika setelah panggilan AJAX saya harus memasang kembali perilaku jadi saya hanya berasumsi itu diperlukan
Clive
Melihat drupal.js: "Drupal.attachBehaviors ditambahkan di bawah ini ke acara siap jQuery dan berjalan pada pemuatan halaman awal. Pengembang yang menerapkan AHAH / Ajax dalam solusi mereka juga harus memanggil fungsi ini setelah konten halaman baru dimuat, mengumpankan dalam elemen yang akan diproses, untuk melampirkan semua perilaku ke konten baru. " Tampaknya saya perlu memohon sendiri attachBehaviour. Tapi; itu membingungkan saya bahwa fungsi 'attach' modul A berjalan meskipun saya belum memanggil attachBehaviour dalam panggilan balik sukses AJAX ...? Mengapa hanya untuk modul pemohon, dan tidak semua modul?
sbrattla
1
Jika Anda menginginkan solusi catch-all, $('body').ajaxSuccess(Drupal.attachBehaviors);mungkin akan berhasil
Clive

Jawaban:

4

Ini, dari komentar di misc/drupal.js, menjelaskan cara kerjanya:

  • Drupal.attachBehaviors ditambahkan di bawah ini ke acara siap jQuery dan sebagainya
  • berjalan pada pemuatan halaman awal. Pengembang menerapkan AHAH / Ajax di
  • solusi juga harus memanggil fungsi ini setelah konten halaman baru
  • dimuat, makan dalam elemen yang akan diproses, untuk melampirkan semua
  • perilaku ke konten baru.
lazysoundsystem
sumber
2

Coba tambahkan ini di Drupal.behavior.b:

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