JointJS:创建链接时需要目标元素

时间:2015-05-15 19:16:14

标签: jointjs

我试图避免链接在空间中结束,我想只允许链接将一个元素与另一个元素连接起来。我目前的代码是:

new joint.shapes.basic.Rect({
  id: id,
  size: {
    width: width,
    height: height
  },
  attrs: {
    text: {
      text: label,
      'font-size': letterSize
    },
    rect: {
      width: width,
      height: height,
      rx: 5,
      ry: 5,
      stroke: '#555',
      'magnet': true
    }
  }
});

对于论文:

var paper = new joint.dia.Paper({
  el: $('#paper-basic'),
  width: 1250,
  height: 1000,
  model: graph,
  gridSize: 1,
  validateConnection: function(cellViewS, magnetS, cellViewT, magnetT, end, linkView) {
    // Prevent linking from output ports to input ports within one element.
    if (cellViewS === cellViewT) return false;
    // Prevent linking to input ports.
    return magnetT;
  },
  markAvailable: true
});

如何要求每个链接都有源和目标?也许通过延长validateConnection

3 个答案:

答案 0 :(得分:4)

如果这仍然相关,现在linkPinning元素上有一个名为Paper的选项:

http://jointjs.com/api#dia.Paper.prototype.options

  

linkPinning - 设置为true(默认值)时,可以固定链接   本文意味着链接的来源或目标可以是一个点。如果你   不想让用户拖动链接并将其放在某处   空白区域,将此设置为false。效果是链接会   每当用户放下它时,它将返回其原始位置   在空白区域的某个地方。

答案 1 :(得分:2)

验证连接仅有助于验证磁铁,当链接末端位于纸张上的随机空间时,它不会被调用。您可以使用以下内容删除不完整的链接:

// keep links from being incomplete
function isLinkInvalid(link){
    return (!link.prop('source/id') || !link.prop('target/id'));
}

paper.on('cell:pointerup', function(cellView) {
    if (! (cellView.model instanceof joint.dia.Link) ) return; // if it's not a link, don't worry about it
    // otherwise, add an event listener to it.  
    cellView.model.on('batch:stop', function(){
        var links = graph.getLinks();
        links.forEach(function(link){
            if(isLinkInvalid(link)){
                link.remove();
        }});
    });
});

它向链接添加了一个eventListener。在'cell:pointerup'上执行此操作非常重要,因为在创建链接时会调用'batch:stop'。如果链接没有目标ID,则它不会连接到端口。

答案 2 :(得分:1)

组合@Anora s和https://groups.google.com/forum/#!topic/jointjs/vwGWDFWVDJI

稍微不同/较短的答案
paper.on('cell:pointerup', function (cellView, evt) {
    var elem = cellView.model
    var source = elem.get('source')
    var target = elem.get('target')
    if (elem instanceof joint.dia.Link && (!source.id || !target.id)) {
        elem.remove()
    }
})