在结合 Extjs 和 D3 时,我正在研究一些非常有趣的东西。
一般来说,ExtJS 会渲染整个页面的主框架,而 D3 会在该框架的某个 div 中渲染动态图。
由于 Extjs 中的渲染逻辑相当复杂,我放置 D3 渲染逻辑的位置似乎至关重要。
在这里我尝试了两个:
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);
},
}