Score:0

ค่า drupalSettings สูญหายเมื่อเข้าถึงจากฟังก์ชันที่มีชื่อ

ธง cl

ฉันมีโมดูลที่กำหนดเองและในไฟล์ .module ฉันเพิ่มค่าให้กับการตั้งค่า Drupal:

  $variables['#attached']['drupalSettings']['my module']['color_body'] = '#dd0000';

ฉันมีฟังก์ชั่นชื่อ js และพยายามเข้าถึงค่า:

ฟังก์ชัน loadcal() {
  var backgroundColor = drupalSettings.mymodule.color_body;
}

ฉันได้รับข้อผิดพลาด:

Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติของไม่ได้กำหนด (อ่าน 'โมดูลของฉัน')
ที่ Object.attach (loadcal.js?rb7yo3:52:37)

ตัวอย่างการทำงานทั้งหมดของการใช้ drupalSettings ดูเหมือนจะเป็นฟังก์ชันที่ไม่ระบุชื่อ:

(ฟังก์ชัน ($) {}

ฉันสามารถ refactor เพื่อทำสิ่งนี้เป็นฟังก์ชัน DOMready แต่ต้องการให้ฟังก์ชันนี้เรียกใช้ได้ ฉันเหนื่อย:

(ฟังก์ชัน loadcal($) {}

แต่นั่นทำให้ไม่พบ loadcal() เมื่อมีการเรียกใช้

อัปเดต

ฉันตัดสินใจว่าฉันสามารถทำได้โดยไม่ต้องตั้งชื่อฟังก์ชัน ฉันสามารถผ่านสิ่งที่ฉันต้องการในตอนเริ่มต้นและไม่ต้องโทรออกในภายหลัง นี่คือรหัสที่เกี่ยวข้อง:

mymodule.libraries

mymodule.calendar:
  css:
    ส่วนประกอบ:
      css/calendar.css: {}
  จส:
    js/loadcal.js: { น้ำหนัก: -18 }
  การพึ่งพา:
    - หลัก / Drupal
    - คอร์/jQuery
    - การตั้งค่าหลัก / drupal

mymodule.module

ฟังก์ชัน mymodule_preprocess_node ($ ตัวแปร) {
  $config = \Drupal::config('mymodule.settings');
  $variables['#attached']['library'][] = 'mymodule/mymodule.calendar';
  $variables['#attached']['drupalSettings']['mymodule']['color_body'] = '#dd0000';
}

loadcal.js

(ฟังก์ชัน (Drupal, drupalSettings ครั้งเดียว) {
  Drupal.behaviors.mymodule = {
    แนบ: ฟังก์ชัน (บริบท การตั้งค่า) {
      ปฏิทิน var = ใหม่ FullCalendar.Calendar (calendarEl, {
        dayCellDidMount: ({วันที่ เอล}) => {
          el.style.backgroundColor = drupalSettings.mymodule.color_body;
        }
      }
   }
)}

ข้อผิดพลาดของคอนโซลคือ:

Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติของไม่ได้กำหนด (อ่าน 'color_body')

แม้ว่าเมื่อตรวจสอบ drupalSettings และการตั้งค่าภายใต้ Closure (ไฟล์แนบ) หรือ Closure.drupalSettings จะไม่มี mymodule แม้ว่าจะแสดงภายใต้ Drupal.behaviors

cn flag
ทำไมต้องมีช่องว่างใน `'โมดูลของฉัน''
apaderno avatar
us flag
ข้อความข้อยกเว้นไม่ตรงกับรหัสที่แสดง ด้วย `drupalSettings.mymodule` ไม่ควรบ่นเกี่ยวกับการอ่านคุณสมบัติ *my module* ของ `undefined`
apaderno avatar
us flag
คุณสามารถใช้ `(function ($) { /* code */ })(jQuery)` หรือ `(function loadcal($) { /* code */ })(jQuery)` อันหลังจะมีประโยชน์หากฟังก์ชันนั้นเรียกตัวเอง (ซึ่งมักไม่เกิดขึ้นกับพฤติกรรมของ Drupal)
cn flag
นี่อาจขึ้นอยู่กับวิธีที่คุณรวม JS ในหน้า หรือวิธี/เวลาที่คุณเรียกใช้ `loadcal()`
apaderno avatar
us flag
@ ไคลฟ์ ใช่ เป็นเรื่องจริง เราจำเป็นต้องดูโค้ดเพิ่มเติม แต่จนถึงตอนนี้ดูเหมือนเป็นคำถาม JavaScript ธรรมดา
cn flag
`$variables` จำเป็นต้องเป็น `&$variables` ในการประกาศฟังก์ชันก่อนประมวลผล
cl flag
ขอขอบคุณ! ฉันจะแก้ไขและลองทันทีที่ฉันหยุดเอาหัวโขกโต๊ะ :)
cl flag
ได้. ทำงาน โปรดเพิ่มเป็นคำตอบ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา