热图按日期隐藏列

时间:2019-02-15 19:18:07

标签: javascript d3.js dc.js

iv设置了一个自定义的onClick事件,以使用“伪造的组”隐藏热图中的列。只要您等到动画完成后再单击yearSlicer的另一年,一切都会正常。在完成加载之前单击将导致不良结果。

假组:

 function filter_bins(source_group, f) {
     return {
         all: function () {
             return source_group.all().filter(function (d) {
                 return f(d.value);
             });
        }
     };
  }

  var filtered_years_group = filter_bins(FTEMonthGroup, function (d) {
      return yearsHidden.length == 0 ? !yearsHidden.includes(d.Year) : yearsHidden.includes(d.Year);
  });

yearSlicer onClick:

   yearSlicer.on("renderlet.somename", function (chart) {
        chart.selectAll('rect').on("click", function (d) {
            hideYear(d.key);
            return chart._onClick(d)
        });
    });

设置隐藏年份:

var yearsHidden = [];
var hideYear = function (year) {
    var index = yearsHidden.indexOf(year);
    if (index === -1) {
        yearsHidden.push(year);
    } else {
         yearsHidden.splice(index, 1);
    }
    heatMap.redraw();
}

https://jsfiddle.net/_M_M_/fLvugo3h/

1 个答案:

答案 0 :(得分:2)

我观察到有时热图数据不会被当前年份的选择所过滤,从而导致出现灰色单元格。希望这与您描述的问题相同!

我不确定这里出了什么问题,但是我注意到yearsHidden与yearSlicer.filters()相同-您正在复制图表已具有的切换行为。

总是很高兴通过删除代码来修复错误。我发现可以通过将filter_bins函数更改为

来解决此问题
var filtered_years_group = filter_bins(FTEMonthGroup, function(d) {
  var years = yearSlicer.filters();
  return years.length ? years.includes(d.Year) : true;
});

,然后删除与yearsHidden有关的所有内容以及click事件处理程序。

https://jsfiddle.net/gordonwoodhull/8npv5zhq/19/

无需进行深入的调试会话,我猜测它们会失去同步,因为dc.js的许多单击处理程序都是异步的。因此,您的处理程序可能会在dc.js过滤代码的不同时间被调用。