Extjs と D3 を組み合わせると、非常に興味深いことを掘り下げています。
一般に、ExtJS はページ全体のメイン フレームをレンダリングし、D3 はそのフレームの特定の div で動的グラフをレンダリングします。
Extjs のレンダリング ロジックは非常に複雑なため、D3 のレンダリング ロジックをどこに配置するかが重要なようです。
ここで私は2つを試しました:
1) 「initComponent」に入れる
[ExtJS]
Ext.define('EDS.view.selector.Container', {
extend: 'Ext.panel.Panel',
alias : 'widget.selectorcontainer',
initComponent: function(){
renderSelectorOrgView();
}
}
[D3]
function renderSelectorOrgView(divId, divHeight, divWidth) {
var svg = d3.select("#" + divId).append("svg");
....
}
問題は、「initComponent」中にdivが完全に生成されないため、機能しないことです。
2) グローバルな Ext.onReady() に入れる
これにより、D3 は空の結果しか選択できないことが判明しました。理由は1)と似ていると思います
3) onRender() に入れる
論理的には、これで問題なく動作するはずです。実際、D3 は div とその属性を完全に取得できます。しかし問題は、ExtJS のレンダリング プロセスがこのコードによって完全に台無しにされてしまうことです。全体のレイアウトが崩れています。では、onRender() で重要なものが不足していますか?
Ext.define('EDS.view.selector.Container', {
extend: 'Ext.panel.Panel',
alias : 'widget.selectorcontainer',
layout: 'fit',
onRender: function(){
//// Render D3
// Selector
console.log("onRender");
console.log(this.height);
console.log(this.width);
var divId = Ext.getCmp('selector-organization').id;
var divHeight = Ext.get(divId).getHeight();
var divWidth = Ext.get(divId).getWidth();
console.log(divHeight);
console.log(divWidth);
renderSelectorOrgView(divId, divHeight, divWidth);
},
}