javascript - 可变对象属性行为
问题描述
我正在尝试使用 D3 框架设置x
和y
svg元素。path
我编写了这段代码来为每个路径添加source
/节点:target
link.enter().insert("path", "g")
.attr("class", "link")
.attr("d", function (d) {
console.dir(d);
var s = {
x: d.source.x0,
y: d.source.y0
};
var t = {
x: d.target.x0,
y: d.target.y0
};
console.log("tx0: " + d.target.x0 + "; ty0: " + d.target.y0);
console.dir(t);
console.log("sx0: " + d.source.x0 + "; sy0: " + d.source.y0);
console.dir(s);
//console.dir(o);
return diagonal({
source: s,
target: t
});
});
当我运行它时,我得到以下控制台日志输出:
有人可以解释为什么属性值x0
和y0
对象输出中的值与接下来记录的值不同,以及为什么target
属性未定义?
已编辑 我编辑此d3 示例并使用 Chrome
解决方案
看似奇怪的结果的原因是您正在尝试访问不存在的属性。如果您查看错误控制台,您会看到表单有五个错误:
Error: Problem parsing d="M0,400CNaN,400 NaN, ,"
如果您在调试器中单步执行您的代码,您会发现目标链接还没有x0
并且尚未设置,y0
所以这就是未定义的原因。为什么是这样?如果你看一下代码,并且是在两个地方设置的;首先,根节点在运行树绘制代码之前设置了这两个属性:tx0
ty0
node.x0
node.y0
root = treeData;
root.x0 = viewerHeight / 2;
root.y0 = 0;
绘制图表后,运行此代码以添加x0
和添加y0
到所有节点:
nodes.forEach(function (d) {
d.x0 = d.x;
d.y0 = d.y;
});
如果一个节点是新添加到图表中的,它不会有x0
和y0
设置,而如果它之前已经显示,隐藏,然后重新显示(例如当你折叠一个父节点然后展开它时),x0
并且y0
已经定义了所以没有错误或未定义的目标节点属性。第一次绘制树时创建的五个链接都具有x0
并y0
为源节点设置,因为它是root
这里的变量:
root = treeData;
root.x0 = viewerHeight / 2;
root.y0 = 0;
但是在绘制完所有内容并运行此代码之前,目标节点不会具有x0
并设置:y0
nodes.forEach(function (d) {
d.x0 = d.x;
d.y0 = d.y;
});
console.log
您从语句中看到的内容与语句之间的差异console.dir
是由于在console.log
运行代码时评估对象状态的console.dir
语句与在其当前状态下提供对对象的访问权限的语句。请参阅console.dir 和console.log 有什么区别?了解更多信息。
推荐阅读
- python - 如何在Python中找到多列中重复行的最大绝对值并显示其行和列索引
- wordpress - 高级自定义字段不保存数据
- livecode - LiveCode 服务器上的 JsonToArray 和 ArrayToJson
- elasticsearch - kibana 在发现选项卡中不显示黄色标记的弹性搜索索引
- reactjs - 将路由器从根传递到 React 中的组件
- apache-spark - 如何在 python 函数中使用 spark session?
- ios - 我无法理解如何使用自动布局的逻辑
- vb.net - 如何从 MDI Child 中保存图像
- c++ - 我可以将 CRTP 与虚函数或仿函数一起用于访问者算法,以容忍对类的更改吗
- python - 如何使用boto3查找S3的每个桶的大小