gpt4 book ai didi

Extjs+D3 : render conflict

转载 作者:行者123 更新时间:2023-12-02 04:53:58 28 4
gpt4 key购买 nike

在结合 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只能select empty result。我认为原因类似于1)

3) 放入onRender()

从逻辑上讲,这应该可以正常工作。而事实上D3可以完美的得到div和它的attr。然而问题是,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);

},
}

最佳答案

使您的 d3 代码与 extjs 一起工作的最佳方法是将 d3 代码放在不同的 html 中。然后在您的 extjs 面板中使用 autoLoad 配置并提供 html 的 url。

{ 
xtype : 'panel',
title : 'd3Graph',
autoLoad : { url : 'd3code.html', scripts : true} // your HTML file containing d3 code.
}

我已经试过了,它对我有用,没有任何错误。

另一种方法是使用 contentEl 配置并在配置中提供 div 的名称,其中 d3 可视化正在呈现。

关于Extjs+D3 : render conflict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18329682/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com