2014-09-23 63 views
1

我有一個維度,用戶可以在其上過濾大約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); 
    } 
} 

任何幫助表示讚賞嘗試。

回答

3

我不認爲你想要使用一個監聽器;聽衆是被動的,在這個過程中很晚。

相反,我認爲你最好的選擇是控制事件級別的行爲(雖然有一些提議使得點擊過濾器行爲更好地配置)。

嘗試是這樣的:

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

相關問題