【问题标题】:JointJS: make link label movable over the link itselfJointJS:使链接标签可在链接本身上移动
【发布时间】:2016-01-19 12:35:16
【问题描述】:

对于链接 - 在 JointJS 图中 - 我尝试实施本教程 (http://jointjs.com/tutorial/constraint-move-to-circle) 以移动链接上的标签,但我不明白将 ConstraintElementView 放在哪里。

  1. 我想让链接的标签在链接上移动。那么如何将链接定义为可移动标签的“路径”?

约束元素视图

var constraint = label; // ???

var ConstraintElementView = joint.dia.ElementView.extend({

    pointerdown: function(evt, x, y) {
        var position = this.model.get('position');
        var size = this.model.get('size');
        var center = g.rect(position.x, position.y, size.width, size.height).center();
        var intersection = constraint.intersectionWithLineFromCenterToPoint(center);
        joint.dia.ElementView.prototype.pointerdown.apply(this, [evt, intersection.x, intersection.y]);
    },
    pointermove: function(evt, x, y) {
        var intersection = constraint.intersectionWithLineFromCenterToPoint(g.point(x, y));
        joint.dia.ElementView.prototype.pointermove.apply(this, [evt, intersection.x, intersection.y]);
    }
});

链接标签

paper.on({
    /**
    *   Doubleclick on link: Add label for link
    */
    'cell:pointerdblclick': function(cellView, event, x, y){            
        if (cellView.model.isLink()) {
            cellView.model.label(0, {
                position: .5,
                attrs: {
                    rect: { fill: '#eeeeee' },
                    text: { text: 'text', 'font-size': 12, ref: 'rect' }
                }
            });
        }
    }
});

论文

var paper = new joint.dia.Paper({
    el: $('#canvas'),
    width: 801,
    height: 496,
    model: graph,
    gridSize: 10,
    elementView: ConstraintElementView,
    defaultLink: new joint.dia.Link({
        router: { name: 'manhattan' },
        connector: { name: 'rounded' },
        attrs: {
            '.marker-target': { d: 'M 10 0 L 0 5 L 10 10 z', fill: '#6a6c8a', stroke: '#6a6c8a' },
            '.connection': { stroke: '#6a6c8a', 'stroke-width': 2 }
        }
    })
});
  1. 因为它可以在链接上移动,所以它应该捕捉到曼哈顿样式链接的每个部分的中心。但我看不到任何机会获得每个段的中心值。

【问题讨论】:

    标签: javascript jointjs


    【解决方案1】:

    您不需要创建任何路径。只需通过计算标签的相对值来改变标签的位置——当然也可以使用绝对值。

    'cell:pointermove': function(event, x, y) {
        if (event.model.isLink()) {
                var clickPoint  = { x: event._dx, y: event._dy },
                    lengthTotal = event.sourcePoint.manhattanDistance(event.targetPoint),
                    length      = event.sourcePoint.manhattanDistance(clickPoint),
                    position    = round(length / lengthTotal, 2);
    
                event.model.label(0, { position: position });
    
        }
    }
    

    【讨论】:

    • 但这会计算直接距离。我需要曼哈顿线。
    • 是否可以得到曼哈顿距离的每一段的大小?
    • 只有两个注意事项: 1. 在 IE11 中 round 未定义并且 Math.round 不是合适的替代品。但是完全删除 round 也同样有效。 2.我不得不将此代码与paper.on()一起使用,答案中并不清楚。希望对其他人有所帮助。
    【解决方案2】:

    可以通过纸上interactive 对象的labelMove 选项使标签沿链接移动:

    var paper = new joint.dia.Paper({ // ... interactive: { labelMove: true } // ... })

    此标志默认为false

    【讨论】:

    • 哦,我在文档中没有看到。但我想将标签捕捉到段的中心。不知道是否可以得到每个段的大小。因此,为此我认为我必须使用类似于“user3848987”给出的解决方案。
    • 顺便说一句:箭头和删除图标正在干扰标签的移动。是否可以通过点击而不是悬停链接来显示这些?
    • interactive: function(cellView) { return { labelMove: true, vertexAdd: false } } 没有效果:不会添加顶点,但标签仍然不能移动...
    • 我有相同的交互选项(虽然我将它设置为对象而不是函数)并且它可以工作,但你必须抓住标签的边缘,而不是里面的文本。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多