-->

dc.js一次添加多个过滤器(dc.js add multiple filters at once)

2019-10-22 04:46发布

是否有可能在一次直流图表上添加一组过滤器? 例如,说我有一个饼图,以及过滤器值的阵列应用。

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可以得到这个任务完成,但我不知道我怎么可以应用直流图表上。 应用filterFunctionosChart.dimension()没有工作。 随着最新发布的DC,我见过这样一些功能addFilterHandlerremoveFilterHandler但是我无法测试,并立即部署该版本。

我有什么其他选择?

Answer 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澄清!)



文章来源: dc.js add multiple filters at once
标签: dc.js