我有一个看起来像这样的DataTable:
+-------+---------+--------+
| month | name | income |
+-------+---------+--------+
| Jan | Alice | $5,000 |
| Feb | Alice | $3,000 |
| Mar | Alice | $4,500 |
| Jan | Bob | $2,750 |
| Feb | Bob | $8,000 |
| Mar | Bob | $1,000 |
| Jan | Charlie | $3,500 |
| Feb | Charlie | $4,100 |
| Mar | Charlie | $3,900 |
... ... ...
我希望使用一个ChartWrapper和一个ControlWrapper来显示Google Visualization。
ChartWrapper将显示一个表格,但我只希望此表格显示最近一个月。为此,我在ChartWrapper上使用.setView()
。
ControlWrapper将在名称列上包装一个CategoryFilter。
我遇到的问题是,当我尝试选择名称时,会引发错误:Invalid row index ... Should be in range [0-...]
我相信我遇到了这个问题,因为setView
接受要显示的静态行数组,但如果表被过滤,那么要显示的行将会有所不同。我这样叫setView
:
var recentRows = dataTable.getFilteredRows([
{
"column": 2,
"minValue": dataTable.getColumnRange(2).max
}
]);
chartWrapper.setView({
"rows": recentRows
});
答案 0 :(得分:1)
使用Dashboard
控件时,
ChartWrapper
和ControlWrapper
需要同步并使用相同的数据集
如您所见,仅在图表上设置view
属性会将其关闭
要更正,请使用DataView
绘制信息中心,
如下面的工作片段所示...
google.charts.load('current', {
callback: drawChart,
packages: ['controls']
});
function drawChart() {
var data = google.visualization.arrayToDataTable([
['month', 'name', 'income'],
[0, 'Alice', 5000],
[1, 'Alice', 3000],
[2, 'Alice', 4500],
[0, 'Bob', 2750],
[1, 'Bob', 8000],
[2, 'Bob', 1000],
[0, 'Charlie', 3500],
[1, 'Charlie', 4100],
[2, 'Charlie', 3900]
]);
var control = new google.visualization.ControlWrapper({
controlType: 'CategoryFilter',
containerId: 'control',
options: {
filterColumnLabel: 'name',
ui: {
allowTyping: false,
allowMultiple: true
}
}
});
var chart = new google.visualization.ChartWrapper({
chartType: 'Table',
containerId: 'chart'
});
var view = new google.visualization.DataView(data);
view.setRows(data.getFilteredRows([{
column: 0,
minValue: data.getColumnRange(0).max
}]));
var dashboard = new google.visualization.Dashboard(
document.getElementById('dashboard')
);
dashboard.bind(control, chart);
dashboard.draw(view);
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="control"></div>
<div id="chart"></div>
另一个选项是不来使用仪表板
独立绘制每个包装,
然后听取控件上的statechange
事件,
然后相应地绘制表格
请参阅以下工作代码段...
google.charts.load('current', {
callback: drawChart,
packages: ['controls']
});
function drawChart() {
var data = google.visualization.arrayToDataTable([
['month', 'name', 'income'],
[0, 'Alice', 5000],
[1, 'Alice', 3000],
[2, 'Alice', 4500],
[0, 'Bob', 2750],
[1, 'Bob', 8000],
[2, 'Bob', 1000],
[0, 'Charlie', 3500],
[1, 'Charlie', 4100],
[2, 'Charlie', 3900]
]);
var control = new google.visualization.ControlWrapper({
controlType: 'CategoryFilter',
containerId: 'control',
dataTable: data,
options: {
filterColumnLabel: 'name',
ui: {
allowTyping: false,
allowMultiple: true
}
}
});
control.draw();
var chart = new google.visualization.ChartWrapper({
chartType: 'Table',
containerId: 'chart',
dataTable: data
});
google.visualization.events.addListener(control, 'ready', drawTable);
google.visualization.events.addListener(control, 'statechange', drawTable);
drawTable();
function drawTable() {
var filters = [{
column: 0,
minValue: data.getColumnRange(0).max
}];
var selectedNames = control.getState().selectedValues;
if (selectedNames.length > 0) {
filters.push({
column: 1,
test: function (value, row, column, table) {
return (selectedNames.indexOf(table.getValue(row, column)) > -1);
}
});
}
chart.setView({
rows: data.getFilteredRows(filters)
});
chart.draw();
}
}
<script src="https://www.gstatic.com/charts/loader.js"></script>
<div id="control"></div>
<div id="chart"></div>