附加整个SVG元素或元素系列

Tim*_*Tim 0 d3.js

使用d3将一系列svg元素追加到特定选择的最佳方法是什么.例如......首先我添加一个矩形.

        tb.append("svg:rect")
        .attr("width", "18")
        .attr("height", "18")
        .attr("y", "9")
        .attr("x", (i * 20) + 5)
        .attr("rx", "4")
        .attr("ry", "4");
Run Code Online (Sandbox Code Playgroud)

现在依赖于我想附加图标的选项.图标可以是一系列路径或rects或多边形.但是是动态的并且基于选项.所以我想做一些像:

tb.append('<path d="M9.826,4.703C8.863,3.057,7.014,2.032,5.001,2.032c-2.012,0-3.861,1.024-4.829,2.671L0,5l0.173,0.299C1.141,6.944,2.99,7.968,5.001,7.968c2.012,0,3.862-1.023,4.825-2.669L10,5L9.826,4.703z M8.451,5.189C7.764,6.235,6.441,6.888,5,6.888c-1.438,0-2.762-0.652-3.453-1.698l-0.124-0.19l0.124-0.188C2.239,3.764,3.562,3.112,5,3.112c1.441,0,2.763,0.651,3.451,1.698l0.125,0.188L8.451,5.189z"/><circle cx="4.999" cy="5" r="1.905"/>');
Run Code Online (Sandbox Code Playgroud)

要么

tb.append('<polygon points="8.272,0 5.8,4.166 9,4.166 1.615,10 3.461,5 1,5 3.743,0.007"/>');
Run Code Online (Sandbox Code Playgroud)

但我不知道元素类型或变化的属性,因为它被输入.是否有一个模式只是插入整个元素作为字符串?还是更好的模式?

mee*_*mit 6

编辑:我刚刚输入下面的答案,但是,在重新阅读你的问题后,我不确定是否通过"动态和基于选项"实际意味着图标类型依赖于数据.如果我误解了,请告诉我,我会删除这个答案....


假设你有dataArray一个构成数据的对象数组.

然后你有:

var selection = d3.selectAll('.icon').data(dataArray)
Run Code Online (Sandbox Code Playgroud)

那么,这听起来像你问的是有条件创建的,比如元素,无论是<rect><circle>,取决于您的数据.理想情况下,你想要的东西 - 但d3不会让你这么做 - 是:

selection.enter()
  .append(function(d) { // <-- doesn't work :(
    return d.type == 'round' ? 'circle' : 'rect';
  })
  .attr('class', 'icon');
Run Code Online (Sandbox Code Playgroud)

即,该.append()方法不接受函数.所以,相反,你可以做的是:

selection.enter()
  .append('g')
  .each(function(d, i) {
    var g = d3.select(this); // That's the svg:g we've just created
    if(d.type == 'round')
      g.append('circle')
    else
      g.append('rect')
  })
  .attr('class', 'icon');
Run Code Online (Sandbox Code Playgroud)

你在DOM中获得的是这样的东西(当然取决于里面的东西dataArray):

<svg>
  <g class="icon">
    <circle>
  </g>
  <g class="icon">
    <rect>
  </g>
  <g class="icon">
    <rect>
  </g>
  <g class="icon">
    <circle>
  </g>
Run Code Online (Sandbox Code Playgroud)