Как использовать d3 v4 с классами Polymer 2.0?

Как можно использовать d3.js (v4) с элементом Polymer 2.0?
Или как использовать библиотеку внутри класса, который уже расширяет другой класс?

Попытка создать элемент полимера d3, чтобы воспользоваться двусторонней привязкой данных полимера, а также синтаксисом и функциями d3. Чтобы данные можно было связать со свойством полимера и передать в функцию d3.data()?

В настоящее время объявление d3 в классе возвращает значение undefined. Нужно ли создавать экземпляр класса с d3 в качестве параметра? Кажется, это работает с Polymer 1.0. Другой подход состоял в том, чтобы создать функцию вне класса и вызвать ее, но это уродливо. Было бы неплохо просто использовать d3 внутри класса.

Или есть более чистый способ?

eg.

<script src="../../bower_components/d3/d3.js"></script>
var d3 = d3; 
debugger; // hits this breakpoint first, and d3 is defined here and below 
<dom-module id="my-app">
  <template>
     <svg id="svg"></svg>
  </template>
  <script>
    class MyApp extends Polymer.Element {
      static get is() { return 'my-app'; }
      static get properties() {
        return {
          data: {
            type: Object,
            observer: '_dataChanged'
          }
        }
      }

      ready: {
        var d3 = d3;  // when it breaks here on the above breakpoint this is defined
        debugger;  // when it hits this breakpoint 2nd, d3 is undefined here and outside the class; what happened? how to scope it in?
      }

      _dataChanged(newValue, oldValue): {
        var circle = d3.select(this.$.svg).data(newValue).enter().append(circle);  //d3 undefined(! how to define?)
      }

    }
    window.customElements.define(MyApp.is, MyApp);
  </script>
</dom-module>

person Cliff Coulter    schedule 31.03.2017    source источник


Ответы (1)


window.d3 - это способ загрузки скрипта в глобальной области видимости. Вы можете загрузить любой внешний скрипт асинхронно или синхронно.

Чтобы загрузить его синхронно, просто поместите тег <script> в файл <head>.

Чтобы загрузить его асинхронно, вы можете добавить прослушиватель событий load к тегу <script>, чтобы выполнять последующие действия после завершения загрузки.

person motss    schedule 01.04.2017
comment
Это сработало, но также оказалось, что я мог сделать еще более простую вещь, которую я пропустил — загрузить d3 до загрузки файла my-app. (d'oh) ‹script src=/bower_components/d3/d3.js›‹/script› ‹script src=/bower_components/webcomponentsjs/webcomponents-loader.js›‹/script› ‹link rel=import href=/src /мое-приложение/мое-приложение.html› - person Cliff Coulter; 14.04.2017
comment
Вы должны убедиться, что сценарий, запускающий window.d3, должен запускаться после того, как сценарий d3 будет успешно загружен и проанализирован. Либо используйте Promise, либо событие onload для сценария: <script src="<path_to_d3>/d3.js" onload="doStuff()"></script> - person motss; 15.04.2017