我有一个维度,用户可以使用大约50个不同的值进行过滤(通过单击与每个过滤器对应的元素)。
显示所有50个过滤器(元素)是不可能的。
所以我展示了前5名过滤器,并使用dc.js中的chart.rowsCap(5)
方法在其他中休息。
用户可以选择多个过滤器,但也可以选择其他。
我想要的是,当选择其他时,应删除其他过滤器,反之亦然。
到目前为止,我尝试了几件事,但没有运气。
以下是我在on('filtered', func)
监听器中尝试的内容
chart.on('filtered', function(chart, filter){
if(filter instanceof Array){
if(chart.filters().indexOf("Others") !== -1) {
chart.filter(null);
chart.filter(filter);
}
} else if(filter == "Others") {
if(chart.filters().indexOf("Others") !== -1 && chart.filters().length > 1){
chart.filter(null);
chart.filter(filter);
}
} else {
if(chart.filters().indexOf("Others") !== -1){
chart.filter(null);
chart.filter(filter);
}
}
感谢任何帮助。
答案 0 :(得分:4)
我认为你不想使用听众;听众是被动的,在这个过程的后期。
相反,我认为您最好的选择是控制事件级别的行为(尽管有一些提议可以使点击过滤器行为更好地配置)。
尝试这样的事情:
var oc = chart.onClick;
chart.onClick = function(d) { chart.filter(null); oc.call(chart, d); }
这会在应用另一个之前简单地清除过滤器,因此它会使切换失败并为您提供单元素选择。我不确定这是否能解答你的整个问题,但希望它能帮助你解决问题。
编辑:这是一个更复杂的onClick,它使其他人与普通切片互斥,但在其他方面保留了切换。
chart.onClick = function (d) {
var had_others = chart.filters().indexOf("Others")>=0;
if(d.key === "Others") {
chart.filter(null);
if(!had_others)
oc.call(chart, d);
else chart.redrawGroup();
} else {
if(had_others) chart.filter(null);
oc.call(chart, d);
}
}