DC.js |如何触发D3更新?

时间:2017-05-03 12:18:14

标签: d3.js dc.js

我正在使用一些D3代码来整理我的DC箱图,例如使circle.outlier半径变小,在每个boxplot后插入一个矩形并附加悬停的标题。

这适用于页面加载。我希望它也能用于过滤。它适用于一种过滤而不是另一种过滤。

我在同一个仪表板上有一个直方图,并且使用.brushOn(true),我有一个事件,可以正确更新过滤器上的箱图:

.on("filtered", function(obj){ update(); });

此代码调用下面的函数,该函数调用另外两个函数:(1)updateFactorFields2,它通过假组更新箱图后面的数据,似乎可以工作。 (2)tidyBoxPlots,这就是问题所在。

function update() {

  var grps = window.grps;//an array holding my crossfilter groups
  var dims = window.dims; //an array holding CF dimensions

  updateFactorFields2(grps[0]);

  factorBox.render();//factorBox is my DC boxplot chart

  tidyBoxPlots('postRender');

}

tidyBoxPlots也会更新.title,但下面的代码就足够了。 tidyBoxPlots最终由histChart.on(“filtered”,...)触发时有效。

function tidyBoxPlots(evType) {

  d3.selectAll("circle.outlier").attr("r","2");//works in one case and not another
  d3.selectAll("g.box").insert("rect","line.center").attr("x","0").attr("y","0").attr("width","8").attr("height","102.5").attr("class","boxHover");//ditto
}

但是,即使调用update()并且updateFactorFields工作,tidyBoxPlots在由下面的触发时也不起作用:

$("[id='filterDropdown']").on('change',function(e,p){
        if (p.selected) {
          var tempIndex = filters[0].indexOf(e.target.id);
          filters[6][tempIndex].push(p.selected);//store this filter
          filters[5][tempIndex].filterFunction(function(d){ return filters[6][tempIndex].indexOf(d)!=-1; });//filter the dimension stored in filters[5] by the array values stored in filters[6]
          update();//calls update() fine

        }

我很确定问题是我正在使用的事件类型,因为我之前遇到过这个问题。所以我尝试了大多数,如果不是所有这些,但没有快乐:

http://dc-js.github.io/dc.js/docs/html/dc.baseMixin.html#on

我正在使用selected.js作为我的下拉列表,因此是jquery。

有人可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:1)

对于遇到同样问题的其他人:问题是获得正确的事件类型以及相对于dc.renderAll()的正确位置调用update();