D3:如何创建输入元素后跟标签文本?

D3: how to create input elements followed by label text?

我有一个数组 var brands = ['Option1', 'Option2']。我想使用 D3 输出如下标记的单选按钮:

<label>
  <input type="radio" name="brand" value="Option1" checked="true"/> Option1
</label>
<label>
  <input type="radio" name="brand" value="Option2" /> Option2
</label>

这是我的 D3,但不太好用:

var radios = d3.select('.panel.left').selectAll('input[name="brand"]').data(brands);
var labels = radios.enter()
        .append("label")
        .attr("for", function(d) { return d; })
        .text(function(d) { return d; })
        .append("input")
        .attr("type", "radio")
        .attr("name", "brand")
        .attr("value", function(d) { return d; })
        .attr('checked', function(d) { if (d === brands[0]) { return 'checked' }; });
d3.selectAll('input[name="brand"]').on('change', function() {
  renderValues(this.value);
});

它非常接近工作,但它输出这个:

<label>
  Option1 <input type="radio" name="brand" value="Option1" checked="true" />
</label>
<label>
  Option2 <input type="radio" name="brand" value="Option2" />
</label>

无论我做什么,我都不知道如何将文本放在 <input> 元素之后。我应该怎么做?

如果我不必在最后重新select 输入元素来添加侦听器,那就太好了。

尝试在脚本末尾添加:

d3.selectAll("label")
    .data(brands)
    .append("text")
    .text(function(d) { return d; });

并删除这些行:

.attr("for", function(d) { return d; })
.text(function(d) { return d; })

您不需要重新select输入。在 .append("input") 之后添加监听器:

.append("input")
.on('change', function() {
  renderValues(this.value);
})