【问题标题】:Is there a way to attach callback what fires whenever a crossfilter dimension filter changes?有没有办法在交叉过滤器维度过滤器更改时附加回调?
【发布时间】:2014-03-13 22:14:53
【问题描述】:

我有几个用 dc.js 构建的图表。我可以通过将回调附加到每个 dc.js 图表的 .on("filterted", function(chart) {}) 来实现所需的功能,但这很烦人,因为我必须为每个图表附加相同的回调。并且容易出错,因为随着新图表的添加,有人必须记住附加事件处理程序。我宁愿只将回调附加到底层交叉过滤器。这可能吗?

有没有办法优化这个...

var ndx = crossfilter(data);
var dimAlpha = ndx.dimension(function(d) {return d.alpha});
var dimBeta = ndx.dimension(function(d) {return d.beta});
var groupAlpha = dimAlpha.group().reduceSum(function(d) {return 1;});
var groupBeta = dimBeta.group().reduceSum(function(d) {return 1;});

dc.pieChart(myDomId1)
  .dimension(dimAlpha)
  .group(groupAlpha)
  .on("filtered", function(chart) {
    //do stuff
  });

dc.pieChart(myDomId2)
  .dimension(dimBeta)
  .group(groupBeta)
  .on("filtered", function(chart) {
    //do stuff
  });

变成这样……

var ndx = crossfilter(data);
var dimAlpha = ndx.dimension(function(d) {return d.alpha});
var dimBeta = ndx.dimension(function(d) {return d.beta});
var groupAlpha = dimAlpha.group().reduceSum(function(d) {return 1;});
var groupBeta = dimBeta.group().reduceSum(function(d) {return 1;});

dc.pieChart(myDomId1)
  .dimension(dimAlpha)
  .group(groupAlpha);

dc.pieChart(myDomId2)
  .dimension(dimBeta)
  .group(groupBeta);

ndx.on("filtered", function() {
  //do stuff
})

【问题讨论】:

    标签: crossfilter dc.js


    【解决方案1】:

    如果您有一百万个图表并且不想手动将事件侦听器附加到每个图表,您可以遍历图表注册表并以这种方式添加它们。例如:

    dc.chartRegistry.list().forEach(function(chart) {
        chart.on('filtered', function() {
            // your event listener code goes here.
        });
    });
    

    请注意,此代码必须在图表实例化后才能工作。

    【讨论】:

      【解决方案2】:

      在没有办法在全局范围内附加一次回调时,您可以做的一件事来降低重复代码带来的风险,即定义一次回调函数并传入一个引用,而不是在每个图表上内联定义它。

      function my_func() {
          // do stuff
      }
      
      dc.pieChart(myDomId2)
          .dimension(dimBeta)
          .group(groupBeta)
          .on("filtered", my_func);
      

      【讨论】:

        【解决方案3】:

        chart 和 filter 也可以传递给 filter 函数,例如:

        function my_func(chart,filter) {
        // do stuff
        }
        
         dc.pieChart(myDomId2)
        .dimension(dimBeta)
        .group(groupBeta)
        .on("filtered", my_func);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-28
          • 1970-01-01
          • 2013-04-13
          • 2016-01-11
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多