Создание элемента «соединения» так просто, как добавление одного или нескольких детей к другому элементу. В вашем примере вы хотите связать свои данные с выбором из <a>
элементов и дать каждому <a>
одному ребенку <circle>
.
Прежде всего, вы должны выбрать "a.node"
вместо "circle.node"
. Это связано с тем, что ваши гиперссылки будут родительскими элементами. Если нет очевидного родительского элемента, и вы просто хотите добавить несколько элементов для каждой точки привязки, используйте <g>
, элемент группы SVG.
Затем вы хотите добавить один элемент <a>
к каждому узлу в выборе ввода. Это создает ваши гиперссылки. После установки каждого атрибута гиперссылки, вы хотите дать ему <circle>
ребенка. Просто: просто позвоните .append("circle")
.
var node = vis.selectAll("a.node")
.data(nodes);
// The entering selection: create the new <a> elements here.
// These elements are automatically part of the update selection in "node".
var nodeEnter = node.enter().append("a")
.attr("class", "node")
.attr("xlink:href", "http://whatever.com")
.call(force.drag);
// Appends a new <circle> element to each element in nodeEnter.
nodeEnter.append("circle")
.attr("r", 5)
.style("fill", function(d) { return fill(d.group); })
node.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
Напомним, что D3, в первую очередь действует на выборов узлов. Поэтому вызов .append()
при вводе выбор означает, что каждый узел в списке получает новый ребенок. Мощный материал!
Еще одна вещь: SVG имеет its own <a>
element, что я имел в виду выше. Это отличается от HTML! Как правило, вы используете только SVG-элементы с SVG и HTML с HTML.
Благодаря @mbostock за то, что я уточнил, как именовать переменные.
Хотя я понимаю, почему это работает для создания, разве это не прерывается при обновлении? Поскольку append() объединяет элементы ввода и обновления, не будет ли он добавлять новый круг к старым узлам при каждом вызове обновления? –
Я обновил этот пример, чтобы сделать его более ясным. selection.append не * объединяет * любые выборы, но selection.enter(). append автоматически добавляет элементы к выбору обновлений. В моем исходном примере был vis.selectAll (...) .data (...) .enter(). Append (...). Это только добавляет элементы к выбору ввода, поэтому проблем нет; ключевым моментом является то, что выбор ввода первоначально содержит только заполнители для * новых * элементов, которые еще не существуют. –