Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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
Javascript crossfilter.js与dc.js更新回调组更改图表_Javascript_Angular_D3.js_Dc.js - Fatal编程技术网

Javascript crossfilter.js与dc.js更新回调组更改图表

Javascript crossfilter.js与dc.js更新回调组更改图表,javascript,angular,d3.js,dc.js,Javascript,Angular,D3.js,Dc.js,我有一个创建dc.js图表的工厂,它使用绑定到$scope的交叉过滤器函数 chart factory通过angular指令通过DOM获取所有图表属性,因此标记如下 <mypie id="mypie" chart-dimesion="mypie.dimension" chart-group="mypie.group"...etc 更新:添加了plnkr,并尝试更好地解释=因此,通过这个示例,我有一种“传统”的方法来构建dc图表,而不是使用指令和元素尝试实现的基于服务的方法。除了我试图在p

我有一个创建dc.js图表的工厂,它使用绑定到$scope的交叉过滤器函数

chart factory通过angular指令通过DOM获取所有图表属性,因此标记如下

<mypie id="mypie" chart-dimesion="mypie.dimension" chart-group="mypie.group"...etc

更新:添加了plnkr,并尝试更好地解释=因此,通过这个示例,我有一种“传统”的方法来构建dc图表,而不是使用指令和元素尝试实现的基于服务的方法。除了我试图在plnkr中显示的内容外,其他一切都可以工作……当我请求新数据(ajax)时,第一次更新很好,使用基于指令的方法,似乎什么都不起作用。我已经尝试了许多方法,但基本上更新$scope dim/组应该可以正常工作吗?我相信它是双向绑定的,因此这两个“范围”应该共享一个引用??但即使我使用scope.$parent.my.dimension等,它也不会影响它。

您的图表仍然绑定到旧的交叉过滤器、维度和组。通常,在加载新数据或替换数据时,不要丢弃交叉筛选、维度或组。使用
crossfilter.remove
crossfilter.add
方法添加或删除数据

下面是如何修改您的示例:

创建控制器时,先创建交叉过滤器、维度和组,以后不要再创建或销毁它们:

myapp.controller('mycontroller', ['$scope', 'dataCaller', function($scope, dataCaller){
      $scope.pageTitle = "Updating DC.js and Crossfilter";

      $scope.currentData1 = "data1.json";
      $scope.currentData2 = "data1.json";

      $scope.my = {};
      $scope.my.cf = crossfilter();
      $scope.my.dimension = $scope.my.cf.dimension(function(d){ return d.key; })
      $scope.my.group = $scope.my.dimension.group().reduceSum(function(d){ return d.value; })
然后将更新功能更改为仅关闭交叉过滤器中的数据:

 $scope.factoryBuildPieExample = function(data) {
    $scope.my.cf.remove()
    $scope.my.cf.add(data.response.data)
    dc.redrawAll();
  }
如果您希望在执行此操作时维护dc.js过滤器,此问题/答案将解释如何:


这是一个有效的打捞工具:

太棒了!再次感谢伊桑。这就是我昨天问的关于散点图的过滤器问题的根本所在。感谢你的帮助!Ethan,我注意到在一个更新函数中实现了这一点之后,我传入了数据,对它进行了处理,所有的东西都在那里,然后cf.remove,然后cf.add,我只添加了响应数组的第一个对象?有什么想法吗?我应该提到,我是从renderlet调用它的,单击图表本身…因此图表上的选择被保留(理想情况下),回调包括模拟过滤的参数。您用
添加
描述的行为听起来不正确,但我不明白你在过滤器周围做什么,从评论中可以看出。我想你必须拿出一个例子,为这个问题提出一个新的问题。
myapp.controller('mycontroller', ['$scope', 'dataCaller', function($scope, dataCaller){
      $scope.pageTitle = "Updating DC.js and Crossfilter";

      $scope.currentData1 = "data1.json";
      $scope.currentData2 = "data1.json";

      $scope.my = {};
      $scope.my.cf = crossfilter();
      $scope.my.dimension = $scope.my.cf.dimension(function(d){ return d.key; })
      $scope.my.group = $scope.my.dimension.group().reduceSum(function(d){ return d.value; })
 $scope.factoryBuildPieExample = function(data) {
    $scope.my.cf.remove()
    $scope.my.cf.add(data.response.data)
    dc.redrawAll();
  }