Hành vi đính kèm của Drupal: phản ứng trên tất cả nội dung mới được tải?


12

Tôi đã có hai mô-đun khác nhau mà theo nhiều cách làm việc cùng nhau. Một trong những điều họ làm việc cùng nhau là mô-đun A tải nội dung qua AJAX và mô-đun B cần đính kèm các trình lắng nghe sự kiện vào nội dung được tải.

Tuy nhiên, dường như khi nội dung được tải qua AJAX bởi mô-đun A, chỉ có chức năng 'đính kèm' của Drupal.behaviours.a được gọi, chứ không phải chức năng 'đính kèm' của Drupal.behaviours.b . Cả hai chức năng đều được gọi khi tải trang, nhưng không phải tải nội dung AJAX tiếp theo.

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

Làm cách nào để tôi thực hiện chức năng 'đính kèm' của Drupal.behaviours.b mỗi khi bất kỳ mô-đun nào tải nội dung mới?


Bạn đã thử thêm Drupal.attachBehaviors();vào cuộc gọi lại thành công ajax chưa?
Clive

Không, nhưng điều đó không nên được chăm sóc tự động? Tôi nghĩ đó là toàn bộ ý tưởng của chức năng 'đính kèm'; rằng nó nên được gọi khi tải trang và cập nhật trang? Tuy nhiên, dường như chỉ có chức năng 'đính kèm' cho mô-đun gọi được gọi trên cập nhật trang?
sbrattla

Đó là sự hiểu biết của tôi, vâng, tôi chưa bao giờ nhìn sâu vào nó. Tôi biết đã có lần sau một cuộc gọi AJAX tôi cần phải gắn lại các hành vi nên tôi chỉ cho rằng nó là bắt buộc
Clive

Nhìn vào drupal.js: "Drupal.attachBehaviors được thêm vào bên dưới vào sự kiện sẵn sàng của jQuery và do đó chạy trên tải trang ban đầu. Các nhà phát triển triển khai AHAH / Ajax trong các giải pháp của họ cũng nên gọi chức năng này sau khi nội dung trang mới đã được tải, cho ăn yếu tố được xử lý, để gắn tất cả các hành vi vào nội dung mới. " Dường như tôi cần phải tự mình gọi đính kèm. Nhưng; nó đánh đố tôi rằng chức năng 'đính kèm' của mô-đun A chạy ngay cả khi tôi chưa gọi đính kèmBehaviours trong cuộc gọi lại thành công AJAX ...? Tại sao chỉ cho mô-đun gọi, và không phải tất cả các mô-đun?
sbrattla

1
Nếu bạn muốn một giải pháp bắt tất cả $('body').ajaxSuccess(Drupal.attachBehaviors);có thể sẽ hoạt động
Clive

Câu trả lời:


4

Điều này, từ các ý kiến ​​trong misc/drupal.js, giải thích cách thức hoạt động của nó:

  • Drupal.attachBehaviors được thêm vào bên dưới vào sự kiện sẵn sàng của jQuery và vì vậy
  • chạy trên tải trang ban đầu. Các nhà phát triển triển khai AHAH / Ajax trong họ
  • các giải pháp cũng nên gọi chức năng này sau khi nội dung trang mới đã được
  • được tải, cho ăn trong một phần tử được xử lý, để đính kèm tất cả
  • hành vi với nội dung mới.

2

Hãy thử thêm phần này vào Drupal.behavior.b:

Drupal.attachBehaviors($(this));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.