2013-07-30 2 views
0

Я делаю визуальное представление базы данных SQL и используя CodeFlower Франсуа Занинотто (который работает от D3.js), чтобы сделать это.Как получить информацию о родителях от ребенка?

Мой вопрос: как мне получить доступ к переменной имени родителя щелкнутого узла? Я понимаю, что этот вопрос похож на How to get data of parent node in d3.js, но их ответ казался неясным для моих целей. Я относительно новичок в D3, так что, возможно, поэтому.

Моего формат JSON код:

{"name":"CRS_LOG_LEVEL","children":[{"name":"CRS_LOG","children":[{"name":"LOG_DESC","size":7,"type":"column"},{"name":"LOG_ID","size":7,"type":"column"},{"name":"LOG_TMSTMP","size":7,"type":"column"},{"name":"LOG_LEVEL_NBR","size":7,"type":"column"},{"name":"LOG_EVENT_CD","size":7,"type":"column"}],"size":100,"type":"table"}],"size":100,"type":"root"} 

Моей мышь слушатель события:

CodeFlower.prototype.click = function(d) { 
// Toggle children on click. 
if (d.children) { //This makes the node that has children collapse and grow in size. 
    d._children = d.children; 
    d.children = null; 
} else { 
    var schemaName; 
    var tableName; 
    var columnName; 
    if(d.type==="column") //only check the parent information if type===column 
    { 
     columnName = d.name; 
     //tableName = Parent's name 
     //schemaName = Parent's Parent's name 
    } 
    d.children = d._children; 
    d._children = null; 
} 
this.update(); 
}; 

^Приведенный выше код моя слегка модифицированная версия CodeFlower.js Франсуа на Проект GitHub, на который я ссылался в начале этого вопроса.

ответ

1

Если вы изменили значение CodeFlower.prototype.flatten, чтобы добавить родительскую ссылку на каждый узел, было бы проще, если вы позже пройдете дерево в событии click. Это было бы структурно похоже на то, что D3 делает в tree.nodes, но без логики позиционирования.

+0

Спасибо! Он работает отлично. Я просто должен был изменить функцию «recurse», чтобы после вызова функции «var Parent = node;» после вызова функции recurse и «v.parent = Parent;» после вызова функции reduce. – murk003

0

Следующий код должен выполнять эту работу.

var JSON = {"name":"CRS_LOG_LEVEL","children":[{"name":"CRS_LOG","children":[{"name":"LOG_DESC","size":7,"type":"column"},{"name":"LOG_ID","size":7,"type":"column"},{"name":"LOG_TMSTMP","size":7,"type":"column"},{"name":"LOG_LEVEL_NBR","size":7,"type":"column"},{"name":"LOG_EVENT_CD","size":7,"type":"column"}],"size":100,"type":"table"}],"size":100,"type":"root"} 

for (var i = 0; i<JSON.children.length; i++) { 
    for (var j = 0; j<JSON.children[i].children.length; j++) { 
     var parentIndex = JSON.children[i].children.indexOf(d); 
     if (parentIndex !== -1) { 
      var parentName = JSON.children[i].children[parentIndex].name; 
     } 
    } 
} 

Переменная parentName должна содержать имя, которое вы где искали.

Обратите внимание, что вы не должны включать первую строку кода (var JSON ...) в свой скрипт и что вы должны заменить каждый вид JSON (в моем скрипте) на ваш объект данных.

+0

Похоже, что он должен работать, но время выполнения будет значительно дольше, если json String будет намного длиннее (что может быть). Перерыв; в выражении if может немного сократить его. Одно можно сказать наверняка, это, безусловно, лучшее решение, включая родительское поле в каждом из этих детей. Есть ли простой способ, как предопределенный метод D3 или что-то еще, что я могу получить родителя и его информацию от ребенка? – murk003

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