0

当我使用 JsniBundle 初始化 d3.js 和 dc.js 时,没有创建全局变量“dc”或“d3”。但是我以相同的方式初始化交叉过滤器并且存在 window.crossfilter 。

我的问题是:使用 JsniBundle 从 dc 库调用方法的最佳方法是什么?是否使用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();
4

2 回答 2

1

也许不是对您的问题的直接回答,但如果您想使用d3.jswith GWT,有一个包装器涵盖了来自以下网址的大部分主要 API d3.jshttps ://github.com/gwtd3/gwt-d3

于 2014-10-19T17:18:15.710 回答
0

这是使它起作用的原因:

将 d3.js 库中的最终赋值语句从

this.d3 = d3;

window.d3 = d3;

并更改 dc.js 库中的最终赋值语句

this.dc = _dc(d3);

window.dc = _dc(window.d3);

我认为这是因为在执行 GWT 代码的 iframe 上下文中有些奇怪,但我并不完全清楚它为什么起作用。我还没有这样做,但我相信您可以使用 LibrarySource 注释的“替换”属性来自动进行替换,而不是编辑原始库。

于 2014-10-19T11:02:15.607 回答