Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Charts DC.js-取消选择功能或过滤除单击的功能外的所有功能_Charts_Dc.js_Crossfilter - Fatal编程技术网

Charts DC.js-取消选择功能或过滤除单击的功能外的所有功能

Charts DC.js-取消选择功能或过滤除单击的功能外的所有功能,charts,dc.js,crossfilter,Charts,Dc.js,Crossfilter,我不确定这是否可能,也不知道研究这一点会不会有运气。我正在使用DC.js图表和crossfilter.js开发一个仪表板。我将以一个行图表为例。与其单击要筛选的项目,是否可以执行相反的操作 比如说。当我单击行图表中的某个项目时,它将取消选择该项目并过滤其他项目,而不是对该选定项目进行过滤。然后我将继续单击其他项目以取消选择 我的目标是实现一个功能,用户可以按住“CTRL键”并“左键单击”行图表中的项目以取消选择。这样,用户无需单击行图表中的50多个项目进行筛选,也无需单击少数项目进行筛选 我有一

我不确定这是否可能,也不知道研究这一点会不会有运气。我正在使用DC.js图表和crossfilter.js开发一个仪表板。我将以一个行图表为例。与其单击要筛选的项目,是否可以执行相反的操作

比如说。当我单击行图表中的某个项目时,它将取消选择该项目并过滤其他项目,而不是对该选定项目进行过滤。然后我将继续单击其他项目以取消选择

我的目标是实现一个功能,用户可以按住“CTRL键”并“左键单击”行图表中的项目以取消选择。这样,用户无需单击行图表中的50多个项目进行筛选,也无需单击少数项目进行筛选

我有一段代码,Javascript可以检测到“CTRL”和“Left click”触发的事件。但不确定如何过滤除单击的内容之外的所有内容


我希望这是有道理的。我试图查看DC.js或Crossfilter api,但找不到一个可以这样做的函数,或者我遗漏了什么

听起来,除了第一次单击之外,您还需要相同的行为,在第一次单击中,您希望保留所有其他内容,并在按下ctrl键时删除单击的项目

如果选择了任何内容,则无论是否按下ctrl键,单击都应像往常一样切换

正如Ethan所建议的,您可能可以将其实现为一个
过滤器处理程序
。这应该也行得通,但由于基本上是相同的行为,我建议使用
onClick
的覆盖

不幸的是,重写此方法的技术并不漂亮,但它可以工作

  var oldClick = rowChart.onClick;
  rowChart.onClick = function(d) {
      var chart = this;
      if(!d3.event.altKey)
          return oldClick.call(chart, d); // normal behavior if no mod key
      var current = chart.filters();
      if(current.length)
          return oldClick.call(chart, d); // normal behavior if there is already a selection
      current = chart.group().all()
          .map(kv => kv.key)
          .filter(k => k != d.key);
      chart.replaceFilter([current]).redrawGroup();
  };

我使用alt键而不是ctrl键,因为Mac上的ctrl-click是右键单击的同义词。

我在需要此功能的行图表上使用此功能。
它比另一个答案短了一点,也许它对某人有用(我不知道哪个更好)

其中
mychart
是您的
dc.rowchart

    var mychart = dc.rowChart('#mychart');
[编辑]

这一个也适用,更短,并且适用于条形图

    mychart.addFilterHandler(function (filters, filter) {
        filters.length = 0; // empty the array
        filters.push(filter);
        return filters;
    });

您可能只需要一个自定义的
filterHandler
,它使用一个filter函数来过滤与过滤器中的内容不匹配的所有内容。
    mychart.addFilterHandler(function (filters, filter) {
        filters.length = 0; // empty the array
        filters.push(filter);
        return filters;
    });