[英]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.js
與GWT
結合使用,則可以使用一個包裝程序來覆蓋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.