应用多个过滤器,但交叉过滤器中的其他人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);
}
}
但是,这种方式只有一个过滤器不适用于多个。只有在选择“其他”时才应用一个过滤器,但应该允许多个选择。 另外,当我再次选择(点击)过滤器时,它不会取消选择它。 – 2014-09-24 05:10:48
好吧,我添加了代码,使他们不选对方,但否则做正常切换。 – Gordon 2014-09-24 11:02:23
太棒了。我希望我可以投票答复这个答案千次。 谢谢。 – 2014-09-24 14:02:24