在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) {.....
答案 0 :(得分:3)
d3.json
是异步调用。这意味着调用将立即返回,但处理程序中的代码将在以后运行。在您的情况下,这意味着当您致电root
时update(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) {.....