每个循环,我对某些选择的对象执行一些更新(请参阅下面的代码段),首先使用exit()
调用删除已删除的元素。我刚刚添加了一个滑块来修改其中一个对象中的参数,当滑块移动时,我调用相同的更新方法(再次使用下面的代码)。但是,当滑块触发更新时,选择会有所不同......特别是exit()
方法失败--- TypeError: selection.exit is not a function
(以及此问题的I think I'm avoiding the standard cause)。
var selection = svgSim.selectAll(".bh")
.data(binary);
// Remove old
console.log("sel = ", selection);
var olds = selection.exit();
olds.remove();
当我将selection
记录到控制台时,内容基本相同......但是对象类型似乎有些不同,或类似的东西。请参见下面的屏幕截图。 selection
(" sel = [...]")的第一个打印输出是正常工作的时候。下次它引发错误,并且打印的格式不同 - 尽管它似乎包含相同的基本数据。
为什么selection.data()
在不同的上下文中调用时会返回不同类型的对象?
console.log
输出有什么区别:什么是pt
(在输出中)以及在此处打印的不同类型的对象。
注意:我理解这个非MWE是否不足以完全解决问题,这就是为什么我试图提出一些可能有助于我找到问题的具体(子)问题,没有-the-以下。
数据类似于
var phaseInit = Math.random();
var binary = [
{name: "a", phase: phaseInit, mass: m1},
{name: "b", phase: phaseInit + 0.5, mass: m2}
];
当滑块移动时,我修改数据如:
binary[0].mass = sliderScaleM1.invert(sval);
(对javascipt和d3来说很新)
答案 0 :(得分:2)
由于我们无法访问MWE(see this comment),因此这是一个通用答案,试图根据提供的信息澄清问题。
在D3中,data()
方法接受三件事:
在第一种和第二种情况下,data()
是 setter 。但是,在第三种情况下,data()
是 getter 。
我们可以在一个基本示例中看到这一点:
var body = d3.select("body");
var data = ["foo", "bar", "baz"];
var sel = body.selectAll(null)
.data(data);
sel.enter()
.append("p")
.html(String)
console.log(sel)
<script src="https://d3js.org/d3.v4.min.js"></script>
但是,如果我们使用data()
作为吸气剂,我们就不再有选择了:
var body = d3.select("body");
var data = ["foo", "bar", "baz"];
var sel = body.selectAll(null)
.data(data);
sel.enter()
.append("p")
.html(String)
var sel2 = body.selectAll("p").data()
console.log(sel2)
<script src="https://d3js.org/d3.v4.min.js"></script>
因此,你无法在该变量上调用exit()
:它不是D3选择,只是数据数组。
查看您的控制台,我们可以看到,在19:57:07
,sel
是常规的D3选择。但是,在19:57:12
,sel
只是一个数组,更具体地说是数据数组。
因此,总而言之,在您的代码中,您使用data()
作为getter,而变量sel
不再保留D3选择。