在crossfilter dc js中应用除Others之外的多个滤波器

时间:2014-09-23 13:25:58

标签: javascript d3.js dc.js crossfilter

我有一个维度,用户可以使用大约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);
    }
}

感谢任何帮助。

1 个答案:

答案 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); 
     } 
}