簡體   English   中英

JsniBundle的用法:在初始化的js庫上調用方法

[英]Usage of JsniBundle: calling methods on initialized js library

當我使用JsniBundle初始化d3.js和dc.js時,沒有創建全局變量“ dc”或“ d3”。 但是我以相同的方式初始化crossfilter,並且存在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();

也許不是您問題的直接答案,但是如果您想將d3.jsGWT結合使用,則可以使用一個包裝程序來覆蓋d3.js大多數主要API: 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);

我認為這是因為在執行GWT代碼的iframe上下文中有些怪異,但我尚不清楚它為什么起作用。 我還沒有做過,但是我相信您可以使用LibrarySource批注的“ replace”屬性來自動執行替換,而不是編輯原始庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM