Обновлено: Edit ниже
Я думаю, вы правы в том, что лучший способ решить onclick
проблему, чтобы сохранить супругам человека в той же группе, что и человека (а не в вложенной группе) , В дополнение к этому, я думаю, вы применяете onclick
в неправильном месте. Мой совет
Изменение линий 325-330 по следующему
var node = g.append("svg:g").attr("class", "node")
.selectAll("g")
.data(function (d) { return d.nodes; })
.enter().append("svg:g");
node.append("svg:rect")
.on("click", clickedNode);
В настоящее время, вы применяя onclick
к группе, содержащей как человека и его/ее супруги, а вместо вы хотите использовать onclick
для каждого человека/супруга отдельно. Обратите внимание, что после того, как вы внесете это изменение, вам нужно будет обновить свой код, чтобы проверить rect
каждого узла (вместо группы узлов g
) относительно того, выбран ли он (строки 355-365). Вам также придется обновить свой CSS до стиля .node rect.normal
и .node rect.selected
на строках 25 и 29 вашего файла CSS.
Вторая проблема заключается в том, что вы рисуете только первого супруга для каждого человека. В настоящее время функция updateSpouses
выполняет итерацию над каждым человеком, а затем добавляет группу с прямоугольником только для первого супруга. Что вам нужно сделать, так это сначала добавить группу для каждого человека с супругами, а затем за супругов каждого человека. Вот черновик, как изменить updateSpouses
, чтобы вы начали:
var node = svgTree.selectAll(".node g")
.append("svg:g").attr("transform", function (d, i) {
if (i == d3.familyTree.rootGeneration)
return "translate(" + (d.spouseX) + "," + (d3.familyTree.gapBetweenSpouses) + ")";
else
return "translate(" + 0 + "," + (d3.familyTree.gapBetweenSpouses) + ")";
})
.filter(function (d, i) { return personSpouses" in d });
var spouses = node.selectAll(".spouse")
.data(function(d){ return d.personSpouses }).enter()
.append("rect")
.on("click", clickedNode);
Редактировать
В ответ на ваш комментарий, я пошел вперед и изменить свой исходный код http://jsfiddle.net/mdml/xJBXm/. Вот краткий обзор изменений, которые я сделал:
- Я положил каждый человек в группе, которая затем имеет свои собственные
onclick
атрибутов (строки 141-146), так что при нажатии на прямоугольнике/текст clickedNode
является называется.
- Я также поместил каждый набор супругов в группу (как описано выше), чтобы каждый из них был индивидуально кликабель (строки 229-232).
- Я изменил функции
resetNodePersonSelected
и setNodePersonSelected
, чтобы они могли искать/обновлять супругов в дополнение к детям.
Я описал изменения на высоком уровне выше, но дайте мне знать, если у вас возникнут дополнительные вопросы по реализации.
Я думаю, что проблема заключается в том, как вы добавляете супругов. Прямо сейчас, 'personSpouses' может быть списком лиц, но никто в вашем дереве не имеет более одного супруга. Я попробовал добавить больше одного супруга к кулаку в вашей скрипке, и она не была нарисована. Если вы хотите, чтобы люди могли иметь нескольких супругов, я бы сначала занялся решением этой проблемы, потому что я думаю, что решение проблемы «onclick» будет простым после этого. – mdml
@ mtitan8 Спасибо за ваш быстрый ответ. Мои исходные данные json содержат более одного супруга, я сократил его для jsFiddle. Вот один из них с несколькими супругами http://jsfiddle.net/mj58659094/StWcr/1/. В json, personId: «1000101» Отец-3 (SMJ), женат два раза, первая жена была personId: «1000102», а вторая жена была personId: «1000103», второй супруг не отображается, но это еще одна проблема. – mj8591