如何在JointJS中以交互方式创建链接

时间:2014-07-05 14:53:54

标签: jointjs

我想以交互方式添加指向基于JointJS的图表的链接。

我的想法是在pointerdown上创建一个小的临时节点,其中包含从原始节点到此临时节点的链接,将其拖到另一个节点的顶​​部,然后在pointerup创建真实链接,删除临时链接和节点。

不幸的是,我不知道如何说服指针移动临时元素而不是发生pointerdown事件的节点。任何的想法? 谢谢!

var tmp_obj;
paper.on('cell:pointerdown', function(cellView, evt, x, y) {
    if(evt.button == 1) {
        // Freeze the selected node so it does not move
        paper.findViewByModel(cellView.model).options.interactive = false;

        // Create a small temporary node on top of the selected node
        tmp_obj = new joint.shapes.basic.Rect({
            position: { x: x, y: y },
            size: { width: 5, height: 5 }
        }

        // Create the link between the original node and the small temporary node

        // And now?
    }
}

paper.on('cell:pointerup', function(cellView, evt, x, y) {

    if(evt.button == 1) {
        // Unfreeze the origin node
        paper.findViewByModel(cellView.model).options.interactive = true;

        // Delete the temporary object (and temporary link)
        tmp_obj.remove()

        // Find the first element below that is not a link nor the dragged element itself.
        var elementBelow = graph.get('cells').find(function(cell) {
            if (cell instanceof joint.dia.Link) return false; // Not interested in links.
            if (cell.id === cellView.model.id) return false; // The same element as the dropped one.
            if (cell.getBBox().containsPoint(g.point(x, y))) {
                return true;
            }
            return false;
        });

        // create the link from cellView to elementBelow 
    }
});

3 个答案:

答案 0 :(得分:8)

也许您可以使用JointJS的磁铁功能?如果在JointJS元素的SVG子元素上设置magnet: true,则该元素将变为活动状态,并允许用户创建从该元素开始的链接。例如:

var r = new joint.shapes.basic.Rect({
    position: { x: 50, y: 50 },
    size: { width: 100, height: 40 },
    attrs: { text: { text: 'basic.Rect', magnet: true } }
});

这将使元素表现得像一个端口。

答案 1 :(得分:1)

防止悬空链接:

joint.dia.Paper({ linkPinning: false })

答案 2 :(得分:0)

Here是一个很好的解决方案。

你可以结合使用

linkView.startArrowheadMove('target');

evt.data.view.pointermove(evt, p.x, p.y);