dc.js一次添加多个过滤器

时间:2015-03-08 18:51:14

标签: dc.js

是否可以在直流图表上一次添加一组过滤器?例如,假设我有一个pieChart,以及要应用的过滤值数组。

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可以完成这项任务,但我不知道如何在dc图表上应用它。在filterFunction上应用osChart.dimension()无效。使用最新的dc版本,我看到了一些函数,如addFilterHandlerremoveFilterHandler,但我现在无法测试和部署该版本。

我还有其他选择吗?

1 个答案:

答案 0 :(得分:1)

通过查看有点复杂的代码,您可以将数组传递给另一个数组.filter()(或未记录但无法实现的.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澄清!)