D3.js 儿童元素没有';t使用D3 force布局继承父数据

D3.js 儿童元素没有';t使用D3 force布局继承父数据,d3.js,force-layout,selectall,D3.js,Force Layout,Selectall,我已经创建了一个D3Force布局,效果非常好。 我的主要代码如下: var nodes = [{id:1, n:'n_1',np:'0'},{id:2, n:'n_2',np:'0'}];//just for demo //1. set data var update = svg.selectAll(".node").data(nodes); //2. enter update.enter().append("svg:g").attr("class", "node") .call(functi

我已经创建了一个D3Force布局,效果非常好。 我的主要代码如下:

var nodes = [{id:1, n:'n_1',np:'0'},{id:2, n:'n_2',np:'0'}];//just for demo
//1. set data
var update = svg.selectAll(".node").data(nodes);
//2. enter
update.enter().append("svg:g").attr("class", "node")
.call(function(p){
  p.append("svg:image").attr("class", "nodeimage");
  p.append("svg:text").attr("class", "nodetext");
});
//3. exit
update.exit().remove();
正如我们所知,d3.selectAll(“.node”).data()是我的数据。因为g的子元素将从父数据继承数据,
d3.selectAll(“.nodeimage”).data()也是我的数据。我说得对吗

事实上,我的数据节点来自后端,并且数据是更新的。例如,某些属性(如
np
)已从0更改为1。我们认为结果是
节点=[{id:1,n:'n_1',np:'1'},{id:2,n:'n_2',np:'0'}]

我需要再次调用上面的函数。但是,
d3.selectAll(“.node”).data()
是正确的,而
d3.selectAll(.nodeimage”).data()现在是错误的

以下代码将无法正常工作

d3.selectAll('.nodeimage').attr("test", function(d){
    //d.np is a wrong value.
});
有什么建议吗


下面是我对JSFIDLE的演示:

这是
d3
的一个奇怪行为。如果我理解正确(这是不允许的),
selection.data(…)
会自动将数据传输到子元素,除非它们已经绑定了一些数据

在您的情况下,这意味着您需要“手动”将数据复制到每个孩子:

  //select any child node, then:
    .each(function() {
      d3.select(this).datum(d3.select(this.parentNode).datum());
    }) 
注意:在您的小提琴中,您只在
enter()
选择中设置
xlink:href
:这是错误的,您需要在整个
update
选择中设置它

update.selectAll(".nodeimage") 
          .each(function() {
             d3.select(this).datum(d3.select(this.parentNode).datum());
          }) 
          .attr("xlink:href", function(d){
            var img;
            if(d.np == 1){
                img = "http://www.gravatar.com/avatar/1eccef322f0beef11e0e47ed7963189b/?default=&s=80"
            }else{
                img = "http://www.gravatar.com/avatar/a1338368fe0b4f3d301398a79c171987/?default=&s=80";
            }
            return img;
          });

请参见此处:

您的问题是什么?在您编辑
np
的代码中,肯定还有其他问题。你能发布一个完整的例子来展示这个错误吗?@tarulen我亲爱的朋友,我已经完成了我在JSFIDLE上的演示。请看一下。我需要你的帮助,谢谢。@MoralesBatovski我已经把我的演示链接放好了,我正在等待你的帮助。哦,伙计们,我清楚地澄清了我的问题,朋友塔鲁伦给了我一个可以接受的答案。为什么投票否决并关闭我的答案?@user1613381这样做有帮助吗?是的,非常感谢。效果非常好。@可以接受答案吗;)