应用多个过滤器,但交叉过滤器中的其他人js

问题描述:

我有一个维度,用户可以在其上过滤大约50个不同的值(通过单击与每个过滤器相对应的元素)。应用多个过滤器,但交叉过滤器中的其他人js

显示所有五十个过滤器(元素)是不可能的。 因此,我正在显示前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); 
    } 
} 

任何帮助表示赞赏尝试。

我不认为你想要使用一个监听器;听众是被动的,在这个过程中很晚。

相反,我认为你最好的选择是控制事件级别的行为(虽然有一些提议使得点击过滤器行为更好地配置)。

尝试是这样的:

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); 
    } 
} 
+0

但是,这种方式只有一个过滤器不适用于多个。只有在选择“其他”时才应用一个过滤器,但应该允许多个选择。 另外,当我再次选择(点击)过滤器时,它不会取消选择它。 – 2014-09-24 05:10:48

+0

好吧,我添加了代码,使他们不选对方,但否则做正常切换。 – Gordon 2014-09-24 11:02:23

+0

太棒了。我希望我可以投票答复这个答案千次。 谢谢。 – 2014-09-24 14:02:24