2013-10-07 6 views
2

Код ссылки: http://jsfiddle.net/mj58659094/yKUsQ/;d3.js Family Tree Супруг Выделите

enter image description here

При нажатии на лицо (узел), он выбирает супруга также. Я хочу только выделить (выделить) человека, на которого я нажал (муж или жена или ребенок). (Когда я проверяю html в FireBug, узлы супруг (g transform = "translate (0,70)") находятся внутри узлов пользователя. Я думаю, что они должны быть снаружи, но внутри группы g class = "node"). Я не знаю, как это исправить. Кто-нибудь, пожалуйста, помогите. Благодарю.

+0

Я думаю, что проблема заключается в том, как вы добавляете супругов. Прямо сейчас, 'personSpouses' может быть списком лиц, но никто в вашем дереве не имеет более одного супруга. Я попробовал добавить больше одного супруга к кулаку в вашей скрипке, и она не была нарисована. Если вы хотите, чтобы люди могли иметь нескольких супругов, я бы сначала занялся решением этой проблемы, потому что я думаю, что решение проблемы «onclick» будет простым после этого. – mdml

+0

@ mtitan8 Спасибо за ваш быстрый ответ. Мои исходные данные json содержат более одного супруга, я сократил его для jsFiddle. Вот один из них с несколькими супругами http://jsfiddle.net/mj58659094/StWcr/1/. В json, personId: «1000101» Отец-3 (SMJ), женат два раза, первая жена была personId: «1000102», а вторая жена была personId: «1000103», второй супруг не отображается, но это еще одна проблема. – mj8591

ответ

4

Обновлено: Edit ниже

Я думаю, вы правы в том, что лучший способ решить onclick проблему, чтобы сохранить супругам человека в той же группе, что и человека (а не в вложенной группе) , В дополнение к этому, я думаю, вы применяете onclick в неправильном месте. Мой совет

  1. Изменение линий 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.

  2. Вторая проблема заключается в том, что вы рисуете только первого супруга для каждого человека. В настоящее время функция 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/. Вот краткий обзор изменений, которые я сделал:

  1. Я положил каждый человек в группе, которая затем имеет свои собственные onclick атрибутов (строки 141-146), так что при нажатии на прямоугольнике/текст clickedNode является называется.
  2. Я также поместил каждый набор супругов в группу (как описано выше), чтобы каждый из них был индивидуально кликабель (строки 229-232).
  3. Я изменил функции resetNodePersonSelected и setNodePersonSelected, чтобы они могли искать/обновлять супругов в дополнение к детям.

Я описал изменения на высоком уровне выше, но дайте мне знать, если у вас возникнут дополнительные вопросы по реализации.

+1

Опять же, спасибо, что нашли время для прохождения моего кода. Я уже пробовал этот сценарий onClick. В этом случае только прямоугольник становится кликабельным. Если вы наведите указатель мыши на текст имени, они не будут доступны. Вот почему событие click привязано к элементу g. Благодарю. – mj8591

+1

Хороший вопрос о возможности щелчка по тексту. См. Мой обновленный ответ выше. – mdml

+0

Большое вам спасибо. Ваше решение работает отлично. Позвольте мне реализовать сценарий множественных супругов. Опять же, большое вам спасибо. – mj8591

Смежные вопросы