2014-10-26 30 views
0

我创建了一个可以创建d3 sunburst图表的angularjs指令。问题是我一直在chrome中获得最大的调用堆栈错误,并且在Firefox中出现了太多的递归错误。我已经将问题追踪到函数d3.layout.partition。现在,这是d3.js提供的一个函数,用于插入值以创建sunburst图表或任何层次结构图。我目前不知道如何解决这个问题。任何建议,将不胜感激。Angular.js在使用d3.layout.partition时给出了最大的调用堆栈大小错误

谢谢。

铬错误

enter image description here

火狐错误

enter image description here

 var partition = d3.layout.partition() 
     .children(function(d){ return d.values; }) 
     .value(function(d) { console.log(d); return d.count; });    

     var root = d3.nest() 
      .key(function(k){ return k.key}) 
      .entries(d); 

     root = {key:'All',values:root}; 

     console.log(partition.nodes(root)) 

在递归误差

+0

也许一个简单的[JSfiddle](http://jsfiddle.net)会更好地解释它。 – PSK 2014-10-26 15:09:21

+0

我编辑了这个问题的截图和代码片段 – 2014-10-26 15:17:16

+0

我怀疑digestTtl可能是原因,默认设置为10. 请有一个[看](https://docs.angularjs.org/api/ng/provider/$ rootScopeProvider) – PSK 2014-10-26 15:28:03

回答

0

虽然我真的不能告诉partition.nodes(根)结果什么是原因你的问题(因为你没有显示足够的代码),我用这个问题,但我设法解决这个问题。

  1. 将您的D3代码到控制器,而不是指令

  2. 如果你决定要在你的指令代码D3,第一只手表后删除观察者。要做到这一点,你可以从http://www.bennadel.com/blog/2480-unbinding-watch-listeners-in-angularjs.htm

      var unbindWatcher = $scope.$watch(
           "clickCount", 
           function(newClickCount) { 
            console.log("Watching click count."); 
            if (newClickCount >= 5) { 
             $scope.isShowingFeedback = true; 
             unbindWatcher(); } 
             } 
            }); 
    

原因采取:

虽然有一些教程,显示将您的D3代码到指令(因为它们操作DOM),我个人认为它可能更适合在控制器中使用d3代码,因为我仍然严重依赖d3而不是angularjs来操作DOM。当然,我不能100%肯定,因为我不久前才开始使用AngularJS。