ExtJS 经典 - 将图表插入工具提示
ExtJS classic - insert chart into tooltip
我是 ExtJS 的新手,所以我不知道它是否可能。 Google 仅回答如何为图表制作工具提示,所以...
我需要制作一个带有工具提示的网格,当用户将鼠标放在单元格上时会显示。在那个工具提示中,它需要是一个自定义信息,基于这个网格的商店(这部分我已经制作)和一个 PolarChart,基于同一个商店。
需要像
Name: first
Date start: 10-02-2017
Date end: 12-02-2017
*It is the PolarChart*
我尝试在 beforeshow
函数中的 tip.update()
内创建一个 PolarChart,但它只 returns Object(Object)
而不是渲染图表。
我试图渲染图表并将其定义为变量,然后像 tip.update(var.render())
一样渲染它,但它抛出 Uncaught TypeError: Cannot read property 'dom' of undefined
错误。
即使我尝试将 属性 renderTo
作为变量 tip
或 Ext.getCmp('tipID')
,它也会抛出该错误。
所以,我认为,它无法到达工具提示的 DOM 节点,因为它是动态创建的。
有什么方法可以解决我的问题吗?
您可以使用动态 tooltip
creation on grid itemmouseenter
and itemmouseleave
.
我创建了一个小 sencha fiddle 演示。
function createToolTip(target, data) {
return Ext.create('Ext.tip.ToolTip', {
// target: target.id,
title: 'Company Overview using pie chart',
width: 200,
height: 200,
items: [{
xtype: 'polar',
width: 180,
height: 180,
theme: 'green',
interactions: ['rotate', 'itemhighlight'],
store: {
fields: ['name', 'value'],
data: data
},
series: {
type: 'pie',
highlight: true,
angleField: 'value',
label: {
field: 'name',
display: 'inside'
},
donut: 30
}
}]
}).showBy(target);
}
Ext.create('Ext.grid.Panel', {
renderTo: Ext.getBody(),
store: store,
title: 'Company Data',
width: '100%',
columns: [{
text: 'Company',
flex: 1,
sortable: true,
dataIndex: 'company'
}, {
text: 'Price',
width: 90,
sortable: true,
dataIndex: 'price',
align: 'right',
renderer: function (v) {
return Ext.util.Format.usMoney(v)
}
}, {
text: 'Revenue',
width: 110,
sortable: true,
align: 'right',
dataIndex: 'revenue %',
renderer: perc
}, {
text: 'Growth',
width: 100,
sortable: true,
align: 'right',
dataIndex: 'growth %',
renderer: perc
}, {
text: 'Product',
width: 110,
sortable: true,
align: 'right',
dataIndex: 'product %',
renderer: perc
}, {
text: 'Market',
width: 100,
sortable: true,
align: 'right',
dataIndex: 'market %',
renderer: perc
}],
listeners: {
itemmouseenter: function (grid, record, item, index, e, eOpts) {
//If tooltip is already created then first destroy then create new.
if (grid.customToolTip) {
Ext.destroy(grid.customToolTip);
}
grid.customToolTip = createToolTip(item, [{
name: 'Revenue',
value: record.get('revenue %')
}, {
name: 'Growth',
value: record.get('growth %')
}, {
name: 'Product',
value: record.get('product %')
}, {
name: 'Market',
value: record.get('market %')
}]);
},
itemmouseleave: function (grid, record, item, index, e, eOpts) {
//destory toolTip on mouse out
if (grid.customToolTip) {
Ext.destroy(grid.customToolTip);
}
}
}
})
我是 ExtJS 的新手,所以我不知道它是否可能。 Google 仅回答如何为图表制作工具提示,所以...
我需要制作一个带有工具提示的网格,当用户将鼠标放在单元格上时会显示。在那个工具提示中,它需要是一个自定义信息,基于这个网格的商店(这部分我已经制作)和一个 PolarChart,基于同一个商店。
需要像
Name: first
Date start: 10-02-2017
Date end: 12-02-2017
*It is the PolarChart*
我尝试在 beforeshow
函数中的 tip.update()
内创建一个 PolarChart,但它只 returns Object(Object)
而不是渲染图表。
我试图渲染图表并将其定义为变量,然后像 tip.update(var.render())
一样渲染它,但它抛出 Uncaught TypeError: Cannot read property 'dom' of undefined
错误。
即使我尝试将 属性 renderTo
作为变量 tip
或 Ext.getCmp('tipID')
,它也会抛出该错误。
所以,我认为,它无法到达工具提示的 DOM 节点,因为它是动态创建的。
有什么方法可以解决我的问题吗?
您可以使用动态 tooltip
creation on grid itemmouseenter
and itemmouseleave
.
我创建了一个小 sencha fiddle 演示。
function createToolTip(target, data) {
return Ext.create('Ext.tip.ToolTip', {
// target: target.id,
title: 'Company Overview using pie chart',
width: 200,
height: 200,
items: [{
xtype: 'polar',
width: 180,
height: 180,
theme: 'green',
interactions: ['rotate', 'itemhighlight'],
store: {
fields: ['name', 'value'],
data: data
},
series: {
type: 'pie',
highlight: true,
angleField: 'value',
label: {
field: 'name',
display: 'inside'
},
donut: 30
}
}]
}).showBy(target);
}
Ext.create('Ext.grid.Panel', {
renderTo: Ext.getBody(),
store: store,
title: 'Company Data',
width: '100%',
columns: [{
text: 'Company',
flex: 1,
sortable: true,
dataIndex: 'company'
}, {
text: 'Price',
width: 90,
sortable: true,
dataIndex: 'price',
align: 'right',
renderer: function (v) {
return Ext.util.Format.usMoney(v)
}
}, {
text: 'Revenue',
width: 110,
sortable: true,
align: 'right',
dataIndex: 'revenue %',
renderer: perc
}, {
text: 'Growth',
width: 100,
sortable: true,
align: 'right',
dataIndex: 'growth %',
renderer: perc
}, {
text: 'Product',
width: 110,
sortable: true,
align: 'right',
dataIndex: 'product %',
renderer: perc
}, {
text: 'Market',
width: 100,
sortable: true,
align: 'right',
dataIndex: 'market %',
renderer: perc
}],
listeners: {
itemmouseenter: function (grid, record, item, index, e, eOpts) {
//If tooltip is already created then first destroy then create new.
if (grid.customToolTip) {
Ext.destroy(grid.customToolTip);
}
grid.customToolTip = createToolTip(item, [{
name: 'Revenue',
value: record.get('revenue %')
}, {
name: 'Growth',
value: record.get('growth %')
}, {
name: 'Product',
value: record.get('product %')
}, {
name: 'Market',
value: record.get('market %')
}]);
},
itemmouseleave: function (grid, record, item, index, e, eOpts) {
//destory toolTip on mouse out
if (grid.customToolTip) {
Ext.destroy(grid.customToolTip);
}
}
}
})