Использование 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 для автоматизации этой замены.

Другие вопросы по тегам