是否可以在直流图表上一次添加一组过滤器?例如,假设我有一个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版本,我看到了一些函数,如addFilterHandler
和removeFilterHandler
,但我现在无法测试和部署该版本。
我还有其他选择吗?
答案 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澄清!)