0

@mbostock

ドラッグ可能なパネルExtjsがあり、グラフd3jsを含め、ドラッグアンドドロップをカスタマイズし、ズーム機能を追加しました。単純な html ページではすべて正常に動作しますが、Extjs パネルでノードをドラッグして移動すると、パンもアクティブになり、パンが無効になりません。

どこが間違っていますか?

これは ExtjsPanel です。

Ext.namespace("libs");
CSP.prj.tresprj.trestest.libs.MainPanel = Ext.extend(Ext.Panel, {
    initComponent : function(){
        this.addEvents({
            'afterrender': true
          });
        Ext.apply(this,{title:'My Custom Panel2'});
        Ext.apply(this,{html:'<div id="content"><div id="buttonDiv"><p>Selezionare il test da effettuare</p></div><!--buttonDiv--><div id="svgContent"></div><!--svgContent--></div><!--content-->'});

        this.addListener('afterrender',function(){

           Xxx.createButton("buttonDiv");
        });
        libs.MainPanel.superclass.initComponent.call(this);
    }
}); 

これはグラフコードです:

var initSvg = function (target) {
    //Activate context menu on right click
    d3.select("body").attr("oncontextmenu", "return true");
    //Create SVG element
    if (jQuery(target + " svg").length) {
        clearSvgDiv();
    }
    var svg = d3.select(target)
             .append("svg")
             .attr("width", width)
             .attr("height", heigth)
             .attr("id", "drawSvg")
             .attr('preserveAspectRatio', 'xMinYMin slice')
             .append('g');
    return svg;
};
var clearSvgDiv = function () {
    d3.select("svg")
        .remove();
};
// Init force layout
var initLayout = function (svg) {
    svg.append('svg:rect')
          .attr('width', width)
          .attr('height', heigth)
          .attr('fill', 'white');
    force = d3.layout.force()
                .nodes(graph.getNodes())
                .links(graph.getEdges())
                .size([width, heigth])
                .linkDistance([50])       
                .charge([-300])     
                .start();
};
// Creates nodes and edge to draw them on the page, calculated positions and repulsions.
var createNodesEdges = function (svg) {
    var x = d3.scale.linear()
        .domain([0, width])
        .range([0, width]);

    var y = d3.scale.linear()
        .domain([0, heigth])
        .range([heigth, 0]);

    svg.call(d3.behavior.zoom().x(x).y(y).scaleExtent([1, 8]).on("zoom", rescale));

    var path = svg.append("svg:g").selectAll("path")
        .data(graph.getEdges())
        .enter()
        .insert("svg:path")
        .attr("class", "line")
        .style("stroke", "#ccc");

    var node_drag = d3.behavior.drag()
        .on("dragstart", dragstart)
        .on("drag", dragmove)
        .on("dragend", dragend);

    var nodes = svg.selectAll("circle")
        .data(graph.getNodes(), function (d) { return d.id; })
        .enter()
        .append("circle")
        .attr("id", function (d) { return d.id; })
        .attr("r", 5)
        .call(node_drag);

    force.on("tick", tick);

    function tick() {
        path.attr("d", function (d) {
            var coordinatesP = findEdgeControlPoints(d);
            return "M" + d.source.x + "," + d.source.y + "S" + coordinatesP.xp + "," + coordinatesP.yp + " " + d.target.x + "," + d.target.y;
        });
        nodes.attr("cx", function (d) { return d.x; })
                .attr("cy", function (d) { return d.y; });
    }
    function dragstart(d, i) {
        force.stop(); // stops the force auto positioning before you start dragging
    }

    function dragmove(d, i) {
        d.px += d3.event.dx;
        d.py += d3.event.dy;
        d.x += d3.event.dx;
        d.y += d3.event.dy;
        tick();
    }

    function dragend(d, i) {
        d.fixed = true; // of course set the node to fixed so the force doesn't include the node in its auto positioning stuff
        tick();
        force.resume();
    }
};
var rescale = function () {
        var trans = d3.event.translate;
        var scale = d3.event.scale;
        svg.attr("transform","translate(" + trans + ")" + " scale(" + scale + ")");
    };
4

1 に答える 1

0

私は問題を発見しました.extjsではなく、http: //d3js.org/によってダウンロードされたd3jsライブラリの縮小版であり、拡張版では問題ありません。

于 2013-07-18T14:03:24.027 に答える