Рейтинг:0

Значения drupalSettings теряются при доступе из именованной функции

флаг cl

У меня есть собственный модуль, и в его файле .module я добавляю значение в настройки Drupal:

  $variables['#attached']['drupalSettings']['мой модуль']['color_body'] = '#dd0000';

У меня есть именованная функция js, и я пытаюсь получить доступ к значению:

функция loadcal() {
  var backgroundColor = drupalSettings.mymodule.color_body;
}

Я получаю сообщение об ошибке:

Uncaught TypeError: невозможно прочитать свойства неопределенного (чтение «мой модуль»)
в Object.attach (loadcal.js?rb7yo3:52:37)

Все рабочие примеры использования drupalSettings кажутся анонимными функциями:

(функция ($) {}

Я могу реорганизовать это как функцию DOMready, но предпочел бы, чтобы эта функция была вызываемой. Я пытался:

(функция loadcal($) {}

но это оставляет loadcal() не найденным при его вызове.

ОБНОВИТЬ

Я решил, что могу обойтись без названия функции. Я мог передать то, что мне было нужно в начале, и мне не нужно было делать последующие звонки. Вот задействованный код:

mymodule.libraries

мой модуль.календарь:
  CSS:
    составная часть:
      css/календарь.css: {}
  js:
    js/loadcal.js: {вес: -18}
  зависимости:
    - ядро/Друпал
    - ядро/JQuery
    - настройки ядра/друпала

моймодуль.модуль

функция mymodule_preprocess_node($variables) {
  $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 calendar = новый FullCalendar.Calendar(calendarEl, {
        dayCellDidMount: ({дата, эл.}) => {
          el.style.backgroundColor = drupalSettings.mymodule.color_body;
        }
      }
   }
)}

Ошибка консоли:

Uncaught TypeError: невозможно прочитать свойства неопределенного (чтение «color_body»)

хотя при проверке drupalSettings и настроек в Closure (прикрепить) или Closure.drupalSettings мой модуль отсутствует, хотя он отображается в Drupal.behaviors.

флаг cn
Зачем пробел в «моем модуле»?
apaderno avatar
флаг us
Сообщение об исключении не соответствует показанному коду. С `drupalSettings.mymodule` он не должен жаловаться на чтение свойства *my module* в `undefined`.
apaderno avatar
флаг us
Вы можете использовать `(function ($) { /* code */ })(jQuery)` или `(function loadcal($) { /* code */ })(jQuery)`. Последнее было бы полезно, если бы эта функция вызывала сама себя (что обычно не происходит с поведением Drupal).
флаг cn
Это, вероятно, сводится к тому, как вы включаете JS на страницу или как/когда вы вызываете `loadcal()`
apaderno avatar
флаг us
@Clive Да, это правда. Нам нужно увидеть больше кода, но пока это кажется простым вопросом JavaScript.
флаг cn
`$variables` должно быть `&$variables` в объявлении функции предварительной обработки.
флаг cl
Спасибо! Я это исправлю и попробую, как только перестану биться головой об стол :)
флаг cl
Ага. Работает. Пожалуйста, добавьте это как ответ.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.