พฤติกรรมแนบของ Drupal: ตอบสนองต่อเนื้อหาที่โหลดใหม่ทั้งหมดหรือไม่


12

ฉันมีสองโมดูลที่แตกต่างกันซึ่งในหลาย ๆ วิธีทำงานร่วมกัน หนึ่งในสิ่งที่พวกเขาทำงานร่วมกันคือโมดูล A โหลดเนื้อหาผ่าน AJAX และโมดูล B จำเป็นต้องแนบผู้ฟังเหตุการณ์กับเนื้อหาที่โหลด

แต่ปรากฏว่าเมื่อเนื้อหาที่โหลดผ่าน AJAX โดยโมดูลเพียงฟังก์ชั่น 'แนบ' ของDrupal.behaviours.aได้รับการเรียกและไม่ฟังก์ชั่น 'แนบ' ของDrupal.behaviours.b ทั้งสองฟังก์ชั่นได้รับการเรียกใช้เมื่อโหลดหน้าเว็บ แต่ไม่ได้โหลด 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');
  }
}    

ฉันจะทำให้ฟังก์ชั่น 'แนบ' ของDrupal.behaviours.bทำงานทุกครั้งที่โมดูลใด ๆ โหลดเนื้อหาใหม่ได้อย่างไร


คุณลองเพิ่มDrupal.attachBehaviors();ใน ajax success callback หรือไม่?
Clive

ไม่ แต่ควรที่จะไม่ได้รับการดูแลโดยอัตโนมัติหรือไม่ ฉันคิดว่าเป็นความคิดทั้งหมดของฟังก์ชั่น 'แนบ'; ควรเรียกว่าเมื่อโหลดหน้าเว็บและอัปเดตหน้าเว็บหรือไม่ ดูเหมือนว่าจะมีเฉพาะฟังก์ชัน 'แนบ' สำหรับโมดูลการเรียกใช้ที่ได้รับการเรียกในการอัปเดตหน้าเว็บใช่ไหม
sbrattla

นั่นคือความเข้าใจของฉันใช่ฉันไม่เคยมองลึกลงไป ฉันรู้ว่ามีบางครั้งที่หลังจากการโทร AJAX ฉันต้อง reattach พฤติกรรมดังนั้นฉันแค่คิดว่ามันเป็นสิ่งจำเป็น
Clive

ดูที่ drupal.js: "Drupal.attachBehaviors ถูกเพิ่มด้านล่างเข้ากับเหตุการณ์ jQuery ready และทำงานบนการโหลดหน้าเริ่มต้นผู้พัฒนาที่ใช้ AHAH / Ajax ในโซลูชันควรเรียกฟังก์ชั่นนี้หลังจากโหลดเนื้อหาหน้าใหม่แล้ว องค์ประกอบที่ต้องดำเนินการเพื่อแนบการทำงานทั้งหมดกับเนื้อหาใหม่ " ดูเหมือนว่าฉันต้องเรียกใช้ AttachBehaviours ด้วยตัวเอง แต่; มันเป็นปริศนาให้ฉันฟังก์ชั่น 'แนบ' ของโมดูล A ทำงานแม้ว่าฉันจะไม่ได้เรียกใช้ AttachBehaviours ในการโทรกลับสำเร็จ AJAX ... เหตุใดจึงใช้เฉพาะกับโมดูลที่เรียกใช้และไม่ใช่ทุกโมดูล
sbrattla

1
หากคุณต้องการวิธีแก้ปัญหาแบบ catch-all $('body').ajaxSuccess(Drupal.attachBehaviors);อาจใช้ได้
Clive

คำตอบ:


4

สิ่งนี้จากความคิดเห็นในmisc/drupal.jsอธิบายถึงวิธีการทำงาน:

  • Drupal.attachBehaviors ถูกเพิ่มด้านล่างไปยังเหตุการณ์พร้อม jQuery และอื่น ๆ
  • ทำงานกับการโหลดหน้าเริ่มต้น นักพัฒนาใช้ AHAH / Ajax ใน
  • โซลูชันควรเรียกใช้ฟังก์ชันนี้หลังจากเนื้อหาของหน้าใหม่
  • โหลดให้อาหารในองค์ประกอบที่ต้องดำเนินการเพื่อแนบทั้งหมด
  • พฤติกรรมต่อเนื้อหาใหม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.