Рейтинг:0

Как правильно загрузить библиотеку JavaScript?

флаг ae

Я пытаюсь отобразить данные формы в виде линейной диаграммы. Я запускаю Drupal 9 в Lando. Я использую Charts 5.0.x с подмодулем Highcharts. Я установил JS-библиотеку Highcharts с помощью composer. Это соответствующий код.

.libraries.yml

хайчарты:
  js:
    /libraries/highcharts/highcharts.js: { }
  зависимости:
    - ядро/jquery

.модуль

функция stats_grades_theme () {
  возвращаться [
    'mychart_template' => [
      'переменные' => ['chart_var' => NULL],
    ],
  ];
}

.routing.yml

статистика_степеней.render_form:
  путь: '/statistics/stats-степени'
  значения по умолчанию:
    _title: «Степени инженерных и физических наук, полученные членами недопредставленных групп»
    _form: '\Drupal\stats_degrees\Form\StatsDegreesForm'
  требования:
      _permission: 'доступ к содержимому'

.html.twig

{# stats_grades/templates/mychart-template.html.twig #}
{{ attach_library('stats_degrees/highcharts') }}

<div id='контейнер' стиль='ширина:100%;высота:100%;'>
  {{ переменная_диаграммы | сырой }}
</div>

Обработчик отправки

публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) { 
   $form_state->setRebuild();
  }

Конструктор форм

 если ($form_state->isRebuilding()) {
   // получаем данные формы и строим диаграмму
    // получаем шаблон ветки
      $form['#theme'] = 'mychart_template';
      $form['#attached'] = массив(
        'библиотека' => массив ('stats_degrees/highcharts')
      );
      $form['#chart_var'] = $rendered_chart;
  }

Шаблон отображается без диаграммы. Когда я смотрю на HTML-разметку, я вижу отображаемый код диаграммы в chart_var, а это в консоли.

Uncaught ReferenceError: Highcharts не определен в js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:4396
js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:128 Uncaught TypeError: $(...).highcharts не является функцией в HTMLDivElement.
[анонимно] (js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:4373
в Function.each (js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:2)
в S.fn.init.each (js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:2)
в Object.attach (js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:4370)
в js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:139
в Array.forEach ()
в Object.Drupal.attachBehaviors (js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:136)
в js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:365
в HTMLDocument.listener (js_fLkad5FjTCYgrjWIVyhfUxVUTz4-TXopB2EJOzHz820.js:353)

Когда я углубляюсь в ошибку, я вижу, что здесь происходит сбой.

(Highcharts)}) (функция (w) {(функция (b) {функция r (b, a) {this.init (b, a)} var v = b.CenteredSeriesMixin, u = b.each, n = b .extend,q=b.merge,g=b.splat;n(r.prototype,{coll:"pane",init:function(b,a){this.chart=a;this.background=[]; a.pane.push(this);this.setOptions(b)},setOptions:function(b){this.options=q(this.defaultOptions,this.chart.angular?{background:{}}:void 0, б)}, визуализация: функция () {var b = this.options, a = this.options.background, c = this.chart.renderer;

Правильно ли я загружаю библиотеку Highcharts?

Jaypan avatar
флаг de
Вы чистили реестр? Отображается ли `highcharts.js` в исходном коде HTML? Верен ли путь к highcharts.js в исходном коде HTML?
флаг cn
Да, обязательно проверьте путь, файлы JS по умолчанию находятся в папке /code, поэтому путь может быть неправильным.Кстати, вам не нужно регистрировать библиотеку самостоятельно, это делает подмодуль (см. charts_highcharts.libraries.yml). Предполагая, что путь к JS правильный и загружается, я думаю, следующий вопрос будет заключаться в том, что содержит `$rendered_chart`?
Dorian Winterfeld avatar
флаг ae
Я почистил реестр. highcharts.js находится в папке /libraries/highcharts/. Вот где композитор установил его. Когда я просматриваю исходный код, единственная ссылка на хайчарты, которую я вижу, находится внизу под
Dorian Winterfeld avatar
флаг ae
$render_chart слишком длинный для этого комментария, но он начинается с
Рейтинг:0
флаг rs

Похоже, что вам нужно добавить 'charts_highcharts/highcharts' в качестве зависимости, например:

хайчарты:
  js:
    /libraries/highcharts/highcharts.js: { }
  зависимости:
    - ядро/jquery
    - диаграммы_highcharts/высокие диаграммы

(Если это не работает, попробуйте «charts_highcharts/charts_highcharts» вместо «charts_highcharts/highcharts»)

Dorian Winterfeld avatar
флаг ae
К сожалению, я получаю такое же поведение с тем же сообщением об ошибке «Ошибка неперехваченной ссылки: Highcharts не определен».
Dorian Winterfeld avatar
флаг ae
Следовать за; ошибки JS возникали только при входе в систему, т. е. диаграмма отображалась только при выходе из системы. Когда я переключил тему с Бартика на Кларо, эта проблема тоже была решена. Диаграмма теперь отображается, когда вы вошли в систему или нет.

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

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