7

编辑 我找到了一个解决方案,涉及使用稍旧版本的 dagre-d3 库(4.11)。如果有人能找到最新版本的问题,那也会有所帮助。谢谢

我正在使用 Dagre d3 绘制一些图表。

当我最初渲染我的图表时,我会

g = new dagreD3.graphlib.Graph()
          .setGraph({})
          .setDefaultEdgeLabel(function() { return {}; });
var svg = d3.select("svg"),
            inner = svg.select("g");
            svgGroup = svg.append("g");
var render = new dagreD3.render();

        render(d3.select("svg g"), g);

        var zoom = d3.behavior.zoom().on("zoom", function() {
              inner.attr("transform", "translate(" + d3.event.translate + ")" +
                    "scale(" + d3.event.scale + ")");
              currentZoomScale = d3.event.scale;
              currentPosition = d3.event.translate;

            });
        svg.call(zoom);

然后,当用户单击某个节点时,我想将 HTML 附加到该节点的标签。除非我重新渲染图表,否则这不会显示,我使用以下方法:

g.node(id).label += "<div>" + inputTemplate + "</div>";

var zoom = d3.behavior.zoom()
        .scale(currentZoomScale)
        .on("zoom", function() {
        inner.attr("transform", "translate(" + d3.event.translate + ")" + "scale(" + d3.event.scale + ")")
                    });
        svg.call(zoom);

        d3.select("svg").on("dblclick.zoom", null);
        inner.attr("transform", "translate(" + currentPosition + ")" + "scale(" + currentZoomScale + ")");

我认为通过维护currentPositioncurrentZoomScale我将能够确保图形在缩放和重新渲染后保持良好。但这种情况并非如此。如果我缩小,我的所有节点都会变小,如果我放大,我会变大。

4

2 回答 2

1

在我看来,问题出在此处:

var svg = d3.select("svg"),
    inner = svg.select("g");
    svgGroup = svg.append("g");

如果您查看代码的顺序,则<g>定义时没有inner. 所以,在这一点上,innernull。当您重新渲染图表时,该组现在就在那里,inner不再是一个null选择。

因此,一个可能的解决方案就是改变顺序:

var svg = d3.select("svg"),
    svgGroup = svg.append("g");//we first append the <g>..    
    inner = svg.select("g");//and only after that we select it
于 2016-10-25T03:29:41.973 回答
1

我对这个问题不是很清楚,但可能是因为你已经包含.scale(currentZoomScale)在第二行

var zoom = d3.behavior.zoom()
        .scale(currentZoomScale)
        .on("zoom", function() {
        inner.attr("transform", "translate(" + d3.event.translate + ")" + "scale(" + d3.event.scale + ")")
                    });
        svg.call(zoom);

        d3.select("svg").on("dblclick.zoom", null);
        inner.attr("transform", "translate(" + currentPosition + ")" + "scale(" + currentZoomScale + ")");

然后你又在innner.attr()?

于 2016-10-24T22:04:13.570 回答