2015-03-08 93 views
1

是否可以在dc图表上一次添加一组过滤器?例如,假设我有一个pieChart和一组要应用的过滤器值。dc.js一次添加多个过滤器

var osChart = dc.pieChart('#oschart'); 

并设置过滤器的输入,说

var filters = ["linux", "mac osx", "windows", "solaris"] 

如何申请过滤器,以便仅生成一个“过滤”事件? 我可以这样做

for (var i=0; i < filters.length; i++) { 
    osChart.filter(filters[i]); 
} 

然而,将产生4 filtered事件。 我正在应用基于用户在文本框中键入的内容的过滤器。当应用过滤器时,我正在进行一些Ajax调用,如果逐个应用过滤器,这往往会变慢。如果过滤器可以一次设置,我可以避免额外的Ajax调用。

crossfilter有一个功能filterFunction它可以完成这项任务,但我不知道如何将它应用于直流图表。在osChart.dimension()上应用filterFunction不起作用。在最新的dc版本中,我看到一些函数,如addFilterHandlerremoveFilterHandler,但是我现在无法测试和部署该版本。

我还有其他选择吗?

回答

1

从看代码,这多少有些令人费解,你可以通过数组另一个数组内部.filter()(或无证但unmagical .replaceFilter())而没有性能损失,因为它会调用之前应用所有过滤器filtered事件。

从最新.filter()源,它使用处理器,但具有相同的行为:

if (_ instanceof Array && _[0] instanceof Array && !_.isFiltered) { 
     _[0].forEach(function (d) { 
      if (_chart.hasFilter(d)) { 
       _removeFilterHandler(_filters, d); 
      } else { 
       _addFilterHandler(_filters, d); 
      } 
     }); 
    } else if (_ === null) { 
     _filters = _resetFilterHandler(_filters); 
    } else { 
     if (_chart.hasFilter(_)) { 
      _removeFilterHandler(_filters, _); 
     } else { 
      _addFilterHandler(_filters, _); 
     } 
    } 
    applyFilters(); 
    _chart._invokeFilteredListener(_); 

所以,如果它发现没有一个isFiltered方法的数组,数组的第一个元素也是一个数组,它将迭代嵌套数组中的元素。

例如,通过[["linux", "mac osx", "windows", "solaris"]]来筛选这四个值。 (谢谢@marcin澄清!)

+0

啊,所以它需要是阵列中的数组,例如.replaceFilter([[“linux”,“mac osx”,“windows”,“solaris”]]) – marcin 2015-05-14 12:51:30

+0

真的@marcin?这是令人惊讶的。你在使用哪张图表? – Gordon 2015-05-14 13:13:47

+0

pieChart。这个答案中的第一行代码('if(_ instanceof Array &&'[0] instanceof Array &&')检查数组的第一个元素是否是数组。 – marcin 2015-05-14 13:28:24

相关问题