我有两段代码,第 1 段代码不起作用,但第 2 段代码起作用。
第 1 部分
let g = circle.data(that.nodes, d => d.id);
g.exit().remove();
g = g.enter().append("svg:g").call(drag).merge(g)
第 2 部分
let g = circle.data(that.nodes, d => d.id);
g.exit().remove();
g = g.enter().append("svg:g");
g = g.call(drag).merge(g);
但是,有趣的是,如果我在不工作的代码末尾记录 g ,我会得到:
但是如果我记录工作代码,我实际上得到:
最佳答案
尽管评论中已经解释了这个问题,但正确的答案是必要的。
这里的主要概念是一些方法,如 enter()
,返回一个新选择。话虽这么说,让我们看看您的工作片段,Piece #1:
let g = circle.data(that.nodes, d => d.id);
这是您的更新选择,因此我们将其称为更新
。
然后,在那之后,你有:
update = update.enter().append("svg:g").call(drag).merge(update)
如前所述,enter()
返回一个新选择。我们称之为enter
。所以,事实上,你有这个:
update = enter.merge(update);
这是合并选择的正确(惯用)方法。
现在,让我们看看您的第二个(非工作)片段,Piece #2。在第三行你有:
update = update.enter().append("svg:g");
您刚刚将更新
变成了输入选择。因此,在下一行中,您将看到:
enter = enter.merge(enter);
这当然是行不通的:您正在合并输入选择。
关于javascript - 为什么将变量设置为自身就能使事情正常进行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58629704/