D3.js d3-更新数据不会导致刷新

D3.js d3-更新数据不会导致刷新,d3.js,D3.js,我正在尝试编写一个简单的d3js应用程序,它将显示一个对象文本数组中的图形。此文本将从后端定期更新。但是为了简单起见,我使用setInterval重写了它,它应该会更新内容 <!doctype html> <html> <head> <script src="d3.js" type="text/javascript"></script> <script src="underscore.js" type="text/

我正在尝试编写一个简单的d3js应用程序,它将显示一个对象文本数组中的图形。此文本将从后端定期更新。但是为了简单起见,我使用setInterval重写了它,它应该会更新内容

<!doctype html>
<html>
<head>
    <script src="d3.js" type="text/javascript"></script>
    <script src="underscore.js" type="text/javascript"></script>
</head>
<body>
<div id="graph">

</div>

<script type="text/javascript">
    var data=[
        { name: 'NONE', distribution: 5}
    ];
    var graphElement = d3.select("#graph");
    // set initial data
    graphElement.selectAll("p")
            .data(data, function(d){return d.name} )
            .enter()
            .append("p")
            .text(function(d){return d.name + d.distribution;});

    var redraw= function() {
        console.dir(data);
        graphElement.selectAll("p")
                .data(data, function(d){return d.name})
                .enter()
                .append("p")
                .text(function(d){return d.name + d.distribution;});
    };


    setInterval(function() {
        var advice = _.find(data, function(i){return i.name == 'ADVICE'});
        if (!advice){
            advice = {name: 'ADVICE', distribution: 0};
            data.push(advice);
        }
        advice.distribution = advice.distribution + 1;
        redraw();
    }, 3000);
</script>

</body>
</html>
页面最初将按预期显示一个段落。然后setInterval开始,并插入一个值为1的“ADVICE”方法。同样,正如所料。 但是,当随后的setInterval启动时,“ADVICE”节点不会更新,即它将保持为“ADVICE1”

我错过了什么明显的东西吗

谢谢你的帮助

问候,


Alex这里有几点需要注意:

1未正确处理输入/更新选择

2您的建议。分配没有从1更改

刷新通知字符串

var ge = graphElement.selectAll("p")
    .data(data, function(d){return d.name});

ge.exit().remove();

ge.enter().append("p");

ge.text(function(d){return d.name + d.distribution;});

你好谢谢你的回复。我可能误解了函数参数对数据方法的作用。我认为应该返回数据的“标识符”,就像db中的主键一样。在本例中,我的标识符实际上是“name”字段。i、 e.建议/无。所以我不知道你为什么在那里使用“分发”。其次,我不希望“建议”出现多次。它应该只显示一次,并以递增的“distribution”显示。为了更正,我更新了小提琴以刷新通知字符串。再次表示歉意,太棒了!非常感谢你!