2013-04-28 132 views
0

我有一个简单的问题,但不幸的是我认为我做错了什么。在d3.js中添加事件监听器

我有一个页面可以生成多个独立的图表。我想为每个图表添加一个事件监听器,这取决于单选按钮组。例如,假设在单选按钮[A,B,C]中有3个选项,并且取决于选择哪个按钮,图表应该可视化一个不同的变量。每个图表异步生成使用AJAX调用,并且构造为可重复使用的图(如下所述:http://bost.ocks.org/mike/chart/

我目前所做的是,这些图表这里创建自己的事件侦听器:

d3.selectAll(".global-control").on("change.pie", readjustPie); 

d3.selectAll(".global-control").on("change.scatter", readjustScatter); 

两个readjustPie和readjustScatter可在不同的 '可重复使用的图表'(例如饼图()和ScatterChart())

功能

当最新的代码执行时(图表异步生成)显然会覆盖一个监听器。我想要做的是类似于在每个函数中添加事件侦听器,以便能够追加侦听器。我已经试过的

d3.selectAll(".global-control") 
.on("change.pie", readjustPie) 
.on("change.scatter", readjustScatter); 

的选项,但它并没有因为功能(调整*)无法找到(显然,他们不是全局函数)的工作。

这样的事件追加可能吗?

很抱歉,如果这个问题是愚蠢的,但我希望得到任何帮助。

最佳, 尼科斯

回答

0

我同意,可重复使用的图表不应该知道的表单控件,如果你想让你的代码的模块化和可测试性。我会暴露在图表API的“readjustPie”,并从全局控件事件调用它,是这样的:

d3.selectAll(".global-control") 
    .on("change.pie", changePieValue) 

function changePieValue(_ctrl){ 
    var ctrlValue = _ctrl.grabYourValueHere; 
    pieChart.readjustPie(_ctrlValue); 
    d3.select('#pie-chart-container1') 
    .call(pieChart) 
} 

下面是一个例子:http://bl.ocks.org/biovisualize/4213367