我正在尝试将链接动态添加到树中以创建新关系。我的意图是开发一个流程图,而不是一棵树。
代码一开始似乎运行良好,但是在其中一个节点上显示引导弹出窗口后,我的新链接消失了。我在想这棵树正在“重新粉刷”,而我的临时链接不包括在内。
这是“默认情况下”的外观:
这是我的新链接的外观:
经过一些循环后,我得到了应该连接的节点的 ID,然后我得到了对这些节点的引用,最后将这些对连接到tree.links
. 这是代码
//Create links
var newLinkPairs = getNodeReferencesForLinks(nodes, newLinksIds);
//Add new pair to the links based on the removed duplicates
var linkPairs = tree.links(nodes).concat(newLinkPairs);
var linkEnter = g.selectAll(".node-link")
.data(linkPairs)
.enter();
linkEnter
.insert("path", "g")
.attr("class", "node-link")
.attr("d", (function(d, i){return createConnector(nodeHeight, nodeWidth)})())
.attr("marker-end", "url(#source-target-marker)");
这些是辅助功能:
function createConnector(nodeHeight, nodeWidth) {
return d3.svg.diagonal()
.source(function(d) {
return {
y: d.source.y + nodeWidth,
x: ((d.source.height - nodeHeight) /2) + d.source.x}; })
.target(function(d) {
return {
y: d.target.y,
x: ((d.target.height - nodeHeight) /2) + d.target.x}; })
.projection(function(d) { return [d.y, d.x]; });
}
function getNodeReferencesForLinks(nodes, newLinksIds){
var newLinkPairs =[];
_.each(newLinksIds, function(p){
var s = _.findWhere(nodes, {id: p.source});
var t = _.findWhere(nodes, {id: p.target});
newLinkPairs.push({source:s,target:t});
// console.log(s.tasks.join(',') + ' -> ' + t.tasks.join(','));
});
return newLinkPairs;
}
有一个更好的方法吗?