D3:从头开始添加新节点的最佳方法
D3: best way to add new nodes from scratch
所以我试图理解 http://bl.ocks.org/mbostock/4062045 的例子,并有几个问题。
从示例中:
var link = svg.selectAll(".link")
.data(graph.links)
.enter().append("line")
.attr("class", "link")
.style("stroke-width", function(d) { return Math.sqrt(d.value); });
基本上所做的(据我所知(是获取"link"类的所有元素(即什么都没有(,然后将"graphs.links"中的所有内容添加到空元素列表中。所有新元素(由"enter(("表示(都被一个"line"标签封装,具有"class"属性集并被风格化。
我的问题是... 如果你知道selectAll((不会得到任何东西,为什么要这样做?为什么不这样做?
var link = svg
.data(graph.links)
.enter().append("line")
.attr("class", "link")
.style("stroke-width", function(d) { return Math.sqrt(d.value); });
我想不这样做的一个原因是它似乎不起作用,哈哈,但为什么不呢?
当然,如果您假设一切都是新的,enter()
似乎也是多余的。
有什么想法吗?
如果你用空graph.links
应用它,然后console.log(links)
,这是你将在chrome javascript控制台上得到的:
[数组[0], 选择: 函数, 选择全部: 函数,属性: 函数, 分类:函数,样式:函数...]
所以,是的,你将有一个空数组,但你已经拥有所有函数,这样,当你之后添加数据时,你不必再做所有事情。这就是 d3 的智能之处。
为了理解到底做了什么,让我们从上到下浏览这个示例:
var link = svg.selectAll(".link")
.data(graph.links)
.enter().append("line")
.attr("class", "link")
.style("stroke-width", function(d) { return Math.sqrt(d.value); });
执行selectAll
以捕获任何预先存在的链接(这些链接与您正确假设的链接不同(,并返回选择(为空(。然后通过 data
将数据分配给空选择。 然后,enter
根据假定data
中的节点与 selectAll
返回的选择之间的差异返回节点选择,在本例中是所有节点,因为没有预先存在的节点。然后通过使用 append
将这些节点附加到 svg 元素。
现在,必须使用 selectAll
的原因相当简单:svg 元素是使用 append
在此处创建的:
var svg = d3.select("body").append("svg")
.attr("width", width)
.attr("height", height);
在这种情况下append
(因为它在 select
之后(通过 select
返回一个带有一个元素的 d3 选择数组。这假定返回的节点只是一个元素。由于 Sizzle 引擎返回类似数组对象中的所有选择,因此它的行为类似于数组,但 d3 假定它是一个只有一个节点元素的数组。这就是为什么当你解除selectAll
和enter
语句时,data
和append
绘制了一个节点。如果您尝试通过将enter
重新附加到语句来更改此设置,那么您就不走运了:enter
尝试使其选择包含由data
定义的所有节点,这些节点在预先存在的选择中不存在。因为它假定预先存在的选择是一个节点数组,所以它无法用 select
返回的单个节点完成其工作。
另一方面,selectAll
返回所需的节点数组。因为没有预先存在的节点,你也可以减轻字符串选择器,但最好把它放在那里,因为它显示了相应地更新所有链接和节点的意图。如果您稍后添加预先存在的节点,则很容易出现错误。
- 节点导出返回一个空对象
- 有条件更新d3.js力图中节点的最佳方法
- 节点:'最佳实践'使用其他js文件的js文件
- 应用程序的最佳目录结构 - 节点 + 道场:这行得通吗?
- 避免节点中全局变量的最佳实践
- 验证请求参数的最佳方法是帆.js/节点.js
- 创建键/值映射开发/生产节点.js的最佳实践
- 节点.js中模块模式的最佳实践
- 获取子节点的最佳方法
- 在 jsTree 中,使节点文本可单击的最佳方法是什么(用于选中复选框)
- 查找具有特定标记的父节点的最佳方式
- Jquery:选择新添加的DOM节点的最佳方法是什么?
- 从节点访问JWT的最佳方式是什么?
- 在Javascript中使用最多的点找到最少的节点的最佳方法
- Angularjs,节点存储路由和发布更改的最佳方式
- 找到元素DOM的根节点(阴影或光)的最佳方法是什么?
- 在JQuery中,将一组节点的数据属性放入数组的最佳方法是什么?
- D3:从头开始添加新节点的最佳方法
- 用户登录后哈希和存储密码在mysql节点bcrypt的最佳实践
- 在特定子节点周围加载相邻子节点的最佳策略是什么?最好是使用一个查询