Я не могу решить, как лучше всего передать изменения в данные, которые происходят у родительского узла (например, элемент SVG g
) до его дочерних элементов (например, SVG circle
элементов) ,d3js: сделать новые родительские данные спускаться в дочерние узлы
Я читал this и this, но все еще не могу понять это.
Вот минимальный рабочий пример. В примере предполагается, что у вас есть объект с именем svg
, который ссылается на выбор d3, содержащий элемент SVG.
data = [{"id":"A","name":"jim"},{"id":"B","name":"dave"},{"id":"C","name":"pete"}];
g = svg.selectAll("g").data(data, function(d) { return d.id; }).enter().append("g");
g.append("circle")
.attr("r", 3)
.attr("cx", 100)
.attr("cy", function(d,i) {return 100 + (i * 30);})
// The data gets passed down to the circles (I think):
console.log("circle data:");
d3.selectAll("g circle").each(function(d) { console.log(d.name); });
// Now change the data, and update the groups' data accordingly
data = [{"id":"A","name":"carol"},{"id":"B","name":"diane"},{"id":"C","name":"susan"}];
svg.selectAll("g").data(data, function(d) { return d.id;});
// These are the results of the change:
console.log("after change, the group has:");
d3.selectAll("g").each(function(d) { console.log(d.name); });
console.log("but the circles still have:");
d3.selectAll("g circle").each(function(d) { console.log(d.name); });
Может ли кто-нибудь помочь мне найти краткий способ получить новые имена во всех дочерних элементах группы? В моем реальном примере жизни каждый g
содержит много circle
s.
Спасибо за комментарии. Эти работы, но только для первого элемента в каждом 'g'. Если я добавлю два круга в каждую группу, только новые выбранные круги будут обновлены новыми данными. Любая идея, почему это может быть? – LondonRob
Если у вас есть более одного круга, вам нужно либо обрабатывать каждый отдельно, классифицируя их по-разному друг от друга, а затем делать select («circle.className») (или аналогичную идею для второго подхода), чтобы получить доступ к каждому из них. Если у вас много кругов в каждом g или переменном номере, вы можете использовать полное объединение данных с вложенными данными для создания/удаления окружностей. –
Это не кажется таким сумасшедшим вариантом использования, что одна часть данных представлена более чем одним элементом SVG. Стыдно, что у нас нет такого API! – LondonRob