javascript - 数据加入d3;我一定没有正确理解选择和/或数据键功能

标签 javascript d3.js

我正在处理一个简单的 d3 示例,我在其中使用 d3 在页面上放置一些新的 div、添加属性以及添加数据驱动的样式。让我感到困惑的部分是当我想使用 d3 使用新数据更新某些样式时。我在下面粘贴了来自 jsFiddle ( http://jsfiddle.net/MzPUg/15/ ) 的代码。

在最初创建 div 的步骤中,我使用了一个键函数来为元素添加索引,在更新步骤(不起作用的部分)我也使用了一个键函数。但从 d3 文档中不清楚的是实际数据连接是如何工作的(例如,索引存储在 DOM 元素中的什么位置?如果有重复索引怎么办?等)。

因此,我的知识存在明显的差距,但这里保持简单,任何人都可以阐明为什么这个示例不起作用?任何关于 d3 中数据连接的精确性质的附加信息都将是蛋糕上的糖霜。 (我已经看过 http://bost.ocks.org/mike/join/ 了。)

//add a container div to the body and add a class
var thediv = d3.select("body").append("div").attr("class","bluediv");

//add six medium-sized divs to the container div
//note that a key index function is provided to the data method here
//where do the resulting index value get stored?
var mediumdivs = thediv.selectAll("div")
    .data([10,50,90,130,170,210],function(d){return d})
    .enter().append("div")
    .style("top",function(d){return d + "px"})
    .style("left",function(d){return d + "px"})
    .attr("class","meddiv")

//UPDATE STEP - NOT WORKING
//Attempt to update the position of two divs
var newdata = [{newval:30,oldval:10},{newval:80,oldval:50}]        
var mediumUpdate = mediumdivs.data(newdata,function(d){return d.oldval})
    .style("left",function(d){return d.newval + "px"})

最佳答案

据我所知,您不会更新已经存在的元素。相反,您告诉 D3 要绘制哪些元素,它决定要在屏幕上删除或更新什么。

我更新了你的 JSFiddle与工作代码。我还添加了下面的代码。

//add a container div to the body and add a class
var thediv = d3.select("body").append("div").attr("class", "bluediv");

function update(data) {
    var mediumdivs = thediv.selectAll("div").data(data, function(d) {
        return d;
    });

    // Tell D3 to add a div for each data point.
    mediumdivs.enter().append("div").style("top", function(d) {
        return d + "px";
    }).style("left", function(d) {
        return d + "px";
    }).attr("class", "meddiv")
    // Add an id element to allow you to find this div outside of D3.
    .attr("id", function(d) { 
        return d;
     });

    // Tell D3 to remove all divs that no longer point to existing data.
    mediumdivs.exit().remove();   
}

// Draw the scene for the initial data array at the top.           
update([10, 50, 90, 130, 170, 210]);      
// Draw the scene with the updated array.
update([30, 80, 90, 130, 170, 210]);

我不确定 D3 如何存储索引的内部工作原理,但您可以将 id 属性添加到您创建的 div 中,以便为您自己创建唯一索引。

关于javascript - 数据加入d3;我一定没有正确理解选择和/或数据键功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11547188/

相关文章:

javascript - 很多 Jquery 和 check/radio/select 样式元素——无样式内容的 Flash

javascript - SimpleHTTPServer 错误 404 - "GET/d3/d3.v3.js HTTP/1.1"404

javascript - Nvd3 : How prevent to display chart between -1 and 1 if have all y values 0?

javascript - “attr()”函数不适用于新创建的元素

javascript - 为 Angular div 添加样式

javascript - 如何遍历 Angular 2 中的对象属性

javascript - Ajax 成功响应不起作用。无法在 IE11 上传递数据

javascript - 使用 fancybox 和 jquery cookie

typescript - 如何使 D3 .data() 参数识别输入数据的 typescript 类型?

d3.js - 在 d3 力定向网络图中更新带有标签的节点和链接未正确删除节点