如何使用Google可视化setSelection()防止无限循环?

时间:2016-08-12 22:32:17

标签: javascript google-visualization

我正在使用图表的Google可视化API遇到这种情况。当用户单击图表项时,它会调用一个打开弹出窗口的事件处理程序(但在下面的示例中,只是执行警报)。它有效,但只有一次;单击该项后,它将保持选中状态,因此不会再次触发事件处理程序(正在侦听'select'事件)。

文档说调用setSelection()方法并传入任何内容,null或空数组作为参数,这将取消选择所有内容。但是当我在事件处理程序的末尾添加它时,它实际上重新选择了所选项并陷入了无限循环。我的代码的简化工作版本如下:

    <!---Google Charts--->
    <script src="https://www.gstatic.com/charts/loader.js"></script>
    <script>
            google.charts.load("current", {packages:["timeline"]});
            google.charts.setOnLoadCallback(drawChart);

            function drawChart() {
                var container = document.getElementById('timelineholder');
                var chart = new google.visualization.Timeline(container);
                var dataTable = new google.visualization.DataTable();
                var options = {tooltip: {isHtml: true}};

                //Add columns
                dataTable.addColumn({type: 'string', id: 'Employer'});
                dataTable.addColumn({type: 'string', id: 'Job ID'});
                dataTable.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
                dataTable.addColumn({type: 'date', id: 'Start Date'});
                dataTable.addColumn({type: 'date', id: 'End Date'});

                //Add Rows
                dataTable.addRows([
                                    ['Some Company',
                                    '123456',
                                    'Some Tooltip Text',
                                    new Date(2016,1,1,0,0,0,0),
                                    new Date(2016,8,1,0,0,0,0)],
                    ]);

                chart.draw(dataTable, options);

                //make rows clickable
                google.visualization.events.addListener(chart, 'select', function(){
                    var selectedItem = chart.getSelection()[0];
                    var placementId = dataTable.getValue(selectedItem.row, 1);

                    alert(placementId);
                    chart.setSelection();//this should effectively deselect the row so it can be clicked on again and fire off the handler again. Instead, it's re-selecting the selected row and causing an infinite loop
                });
            }
    </script>

<div id="timelineholder" class="timelineholder"></div>

2 个答案:

答案 0 :(得分:1)

ax = sns.boxplot(x="value", y="combined_delta", data=df) 图表是我唯一没有Timeline method

的图表

因此导致错误

一旦选择了某些内容,就无法取消选中(在setSelection图表上) 没有重新绘制图表

尝试...
Timeline

而不是...
chart.draw(dataTable, options);

答案 1 :(得分:0)

仅作记录:我在使用Google图表的时间轴进行无限循环时遇到困难,我发现我在第二列(标签)中填充了“数字”而不是“字符串”。我只是打电话给.toString而问题消失了……

尽管如此,我还是无法复制它。

我也在使用ng2-google-charts。

也许可以帮助其他人。