带有d3js树的TypeError

时间:2014-01-03 11:24:21

标签: javascript d3.js typeerror

在d3js tree sample中,我试图将调用移到d3.json函数之外的更新。当我这样做时,我得到:

  

TypeError:d未定义

这是代码(这里的函数与示例的链接略有不同)。请注意,我将调用移到了d3.json函数之外的更新。请注意,root是一个全局变量。

  d3.json("../data/flare.json", function(json) {   
     root = json;   
     root.x0 = height / 2;   
     root.y0 = 0;

    function collapse(d) {
      if (d.children) {
        d._children = d.children;
        d._children.forEach(collapse);
        d.children = null;
      }   
    }

   root.children.forEach(collapse);   
   // move this out   
   // update(root); 
});

update(root);

function update(source) {.....

2 个答案:

答案 0 :(得分:3)

d3.json是异步调用。这意味着调用将立即返回,但处理程序中的代码将在以后运行。在您的情况下,这意味着当您致电rootupdate(root)未定义(或为空)。

简而言之,您 update(root)的回调中呼叫d3.json。虽然有一些可能性使其在回调之外工作,但这些可能性更复杂。

答案 1 :(得分:0)

我们不能将根变量用于function之外,因为root是该函数的局部变量。如果要在外部使用,则将root用作global varible用于保存JSON;

var root;
    d3.json("../data/flare.json", function(json) {   
     root = json;   
     root.x0 = height / 2;   
     root.y0 = 0;

    function collapse(d) {
      if (d.children) {
        d._children = d.children;
        d._children.forEach(collapse);
        d.children = null;
      }   
    }

   root.children.forEach(collapse);   
   // move this out   
   // update(root); 
});



function update(source) {.....