Использование JsniBundle: вызов методов в инициализированной библиотеке js
Когда я инициализирую d3.js и dc.js с помощью JsniBundle, глобальная переменная "dc" или "d3" не создается. Но я инициализирую кроссфильтр таким же образом, и в нем присутствует window.crossfilter.
Мой вопрос: как лучше всего вызывать методы из библиотеки dc, используя JsniBundle? Использует JsUtils.prop(window, "dc")
правильный способ получить ссылку на объект библиотеки?
В методе drawBarChartWidget() ниже переменная "dc" является нулевой.
public interface D3Bundle extends JsniBundle {
@LibrarySource("d3.js")
public void initD3();
}
public interface CrossfilterBundle extends JsniBundle {
@LibrarySource("crossfilter.js")
public abstract void initCrossfilter();
}
public abstract static class DCBundle implements JsniBundle {
@LibrarySource("dc.js")
public abstract void initDC();
public void drawBarChart(Widget container, JSONValue data, Properties chartConfig) {
JavaScriptObject dc = JsUtils.prop(window, "dc");
}
}
LayoutPanel layoutPanel = new LayoutPanel();
SimplePanel chartPanel = new SimplePanel();
public ChartDemo() {
D3Bundle d3 = GWT.create(D3Bundle.class);
CrossfilterBundle crossfilter = GWT.create(CrossfilterBundle.class);
final DCBundle dc = GWT.create(DCBundle.class);
d3.initD3();
crossfilter.initCrossfilter();
dc.initDC();
2 ответа
Может быть, не прямой ответ на ваш вопрос, но если вы хотите использовать d3.js
с GWT
есть оболочка, которая покрывает большинство основных API от d3.js
: https://github.com/gwtd3/gwt-d3
Вот что заставило это работать:
изменить окончательный оператор присваивания в библиотеке d3.js с
this.d3 = d3;
в
window.d3 = d3;
и измените окончательный оператор присваивания в библиотеке dc.js с
this.dc = _dc(d3);
в
window.dc = _dc(window.d3);
Я предполагаю, что это из-за некоторой странности вокруг контекста iframe, в котором выполняется код GWT, но я не совсем понимаю, почему он работает. Я еще этого не сделал, но я считаю, что вместо редактирования исходной библиотеки вы можете использовать атрибут "replace" аннотации LibrarySource для автоматизации этой замены.