Javascript crossfilter.js与dc.js更新回调组更改图表
我有一个创建dc.js图表的工厂,它使用绑定到$scope的交叉过滤器函数 chart factory通过angular指令通过DOM获取所有图表属性,因此标记如下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
<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();
}