Điểm:0

giá trị drupalSettings bị mất khi truy cập từ một chức năng được đặt tên

lá cờ cl

Tôi có một mô-đun tùy chỉnh và trong tệp .module của nó, tôi thêm một giá trị vào cài đặt Drupal:

  $variables['#attached']['drupalSettings']['mô-đun của tôi']['color_body'] = '#dd0000';

Tôi có một hàm js được đặt tên và cố gắng truy cập giá trị:

hàm loadcal() {
  var backgroundColor = drupalSettings.mymodule.color_body;
}

tôi nhận được lỗi:

Uncaught TypeError: Không thể đọc các thuộc tính của không xác định (đọc 'mô-đun của tôi')
tại Object.attach (loadcal.js?rb7yo3:52:37)

Tất cả các ví dụ hoạt động về việc sử dụng drupalSettings dường như đều có chức năng ẩn danh:

(hàm ($) {}

Tôi có thể cấu trúc lại để thực hiện việc này dưới dạng hàm DOMready, nhưng muốn hàm này có thể gọi được hơn. Tôi đã thử:

(hàm nạp($) {}

nhưng điều đó khiến loadcal() không được tìm thấy khi nó được gọi.

CẬP NHẬT

Tôi quyết định tôi có thể làm mà không cần đặt tên cho chức năng. Tôi có thể chuyển những gì tôi cần ngay từ đầu và không phải thực hiện các cuộc gọi tiếp theo. Đây là mã liên quan:

mymodule.libraries

mymodule.calendar:
  css:
    thành phần:
      css/calendar.css: {}
  js:
    js/loadcal.js: { trọng lượng: -18 }
  phụ thuộc:
    - lõi/Drupal
    - lõi/jQuery
    - lõi/drupalSettings

mymodule.module

function mymodule_pre process_node($variables) {
  $config = \Drupal::config('mymodule.settings');
  $variables['#attached']['library'][] = 'mymodule/mymodule.calendar';
  $variables['#attached']['drupalSettings']['mymodule']['color_body'] = '#dd0000';
}

loadcal.js

(hàm (Drupal, drupalSettings, once) {
  Drupal.behaviors.mymodule = {
    đính kèm: chức năng (bối cảnh, cài đặt) {
      lịch var = new FullCalendar.Calendar(calendarEl, {
        dayCellDidMount: ({date, el}) => {
          el.style.backgroundColor = drupalSettings.mymodule.color_body;
        }
      }
   }
)}

Lỗi bảng điều khiển là:

Uncaught TypeError: Không thể đọc các thuộc tính không xác định (đọc 'color_body')

mặc dù khi kiểm tra drupalSettings và cài đặt trong Closure (attach) hoặc Closure.drupalSettings, mymodule không có ở đó, mặc dù nó hiển thị trong Drupal.behaviors.

lá cờ cn
Tại sao không gian trong `'mô-đun của tôi'`?
apaderno avatar
lá cờ us
Thông báo ngoại lệ không khớp với mã hiển thị. Với `drupalSettings.mymodule`, bạn không nên phàn nàn về việc đọc thuộc tính *my module* của `undefined`.
apaderno avatar
lá cờ us
Bạn có thể sử dụng `(function ($) { /* code */ })(jQuery)` hoặc `(function loadcal($) { /* code */ })(jQuery)`. Cái sau sẽ hữu ích nếu chức năng đó tự gọi (điều này thường không xảy ra với các hành vi Drupal).
lá cờ cn
Điều này có thể liên quan đến cách bạn đưa JS vào trang hoặc cách/khi bạn gọi `loadcal()`
apaderno avatar
lá cờ us
@Clive Vâng, đó là sự thật. Chúng tôi cần xem thêm mã, nhưng cho đến nay đây có vẻ là một câu hỏi đơn giản về JavaScript.
lá cờ cn
`$variables` cần phải là `&$variables` trong khai báo hàm tiền xử lý
lá cờ cl
Cảm ơn bạn! Tôi sẽ sửa nó và thử ngay khi tôi ngừng đập đầu vào bàn :)
lá cờ cl
Chuẩn rồi. Làm. Vui lòng thêm nó như một câu trả lời.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.