Javascript JointJS-处理链接删除单击

Javascript JointJS-处理链接删除单击,javascript,jointjs,Javascript,Jointjs,创建链接后,将鼠标悬停在该链接上会显示红色(X)以将其删除 单击此按钮将触发一系列事件 (通过订阅“所有”活动收集): 单元格:指针镇 链接:指针镇 单元格:pointermove(x5,似乎可疑) 单元格:pointerup 在浏览了文档并花了太长时间挖掘这些事件的param对象之后,我发现没有什么可以用来有效地知道链接是否将被删除 我肯定错过了一些明显的东西 我可以将pointerdown和pointerup之间的链接集合与图形进行比较,但这非常难看 您可以在graphremove事件上

创建链接后,将鼠标悬停在该链接上会显示红色(X)以将其删除

单击此按钮将触发一系列事件 (通过订阅“所有”活动收集):

  • 单元格:指针镇
  • 链接:指针镇
  • 单元格:pointermove(x5,似乎可疑)
  • 单元格:pointerup
在浏览了文档并花了太长时间挖掘这些事件的param对象之后,我发现没有什么可以用来有效地知道链接是否将被删除

我肯定错过了一些明显的东西


我可以将pointerdown和pointerup之间的链接集合与图形进行比较,但这非常难看

您可以在graph
remove
事件上收听,查看链接是否被删除:

graph.on('remove', function(cell, collection, opt) {
   if (cell.isLink()) {
      // a link was removed  (cell.id contains the ID of the removed link)
   }
})

如果要侦听由链接上的“X”触发的移除事件(JointJS将这些鼠标悬停元素称为“链接工具”):

您可以将事件传递给SVG元素,该元素将在joint.dia.Paper上触发,如下所示:

    let link = new joint.dia.Link({
        source: getLink(conn.source),
        target: getLink(conn.target),
        attr: {},
        router: {name: 'metro'},
        customAttr: {fullSource: conn.source, fullTarget: conn.target},
        toolMarkup: [
            '<g class="link-tool">',
            '<g class="tool-remove" event="tool:remove">',
            '<circle r="11" />',
            '<path transform="scale(.8) translate(-16, -16)" d="M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248z"/>',
            '<title>Remove link.</title>',
            '</g>',
            '**<g event="link:options">**',
            '<circle r="11" transform="translate(25)"/>',
            '<path fill="white" transform="scale(.55) translate(29, -16)" d="M31.229,17.736c0.064-0.571,0.104-1.148,0.104-1.736s-0.04-1.166-0.104-1.737l-4.377-1.557c-0.218-0.716-0.504-1.401-0.851-2.05l1.993-4.192c-0.725-0.91-1.549-1.734-2.458-2.459l-4.193,1.994c-0.647-0.347-1.334-0.632-2.049-0.849l-1.558-4.378C17.165,0.708,16.588,0.667,16,0.667s-1.166,0.041-1.737,0.105L12.707,5.15c-0.716,0.217-1.401,0.502-2.05,0.849L6.464,4.005C5.554,4.73,4.73,5.554,4.005,6.464l1.994,4.192c-0.347,0.648-0.632,1.334-0.849,2.05l-4.378,1.557C0.708,14.834,0.667,15.412,0.667,16s0.041,1.165,0.105,1.736l4.378,1.558c0.217,0.715,0.502,1.401,0.849,2.049l-1.994,4.193c0.725,0.909,1.549,1.733,2.459,2.458l4.192-1.993c0.648,0.347,1.334,0.633,2.05,0.851l1.557,4.377c0.571,0.064,1.148,0.104,1.737,0.104c0.588,0,1.165-0.04,1.736-0.104l1.558-4.377c0.715-0.218,1.399-0.504,2.049-0.851l4.193,1.993c0.909-0.725,1.733-1.549,2.458-2.458l-1.993-4.193c0.347-0.647,0.633-1.334,0.851-2.049L31.229,17.736zM16,20.871c-2.69,0-4.872-2.182-4.872-4.871c0-2.69,2.182-4.872,4.872-4.872c2.689,0,4.871,2.182,4.871,4.872C20.871,18.689,18.689,20.871,16,20.871z"/>',
            '<title>Link options.</title>',
            '</g>',
            '</g>'
        ].join('')
    });
//从图表中删除链接
纸上('工具:移除')功能(链接视图,evt){
var confirmValue=confirm('Delete Flow'),函数(结果){
});
//警报(确认值);
if(confirmValue){
var IsDeleteTestEP=错误;
//检查用户是否也需要删除该步骤
如果(确认('是否也要删除该步骤?')){
IsDeleteTestEP=真;
}
console.log(“删除链接”+linkView);
var pathLabel=linkView.model.attributes.labels[0].attrs.text.text;
var destlab=linkView.targetView.model.attributes.attrs[“.tooltip”].text;
if(linkView.sourceView.model.attributes.attrs[“.tooltip”]!=“未定义”){
srcLabel=linkView.sourceView.model.attributes.attrs[“.tooltip”].text;
}否则{
srcLabel=“源”;
}
var graphJSON=gph.toJSON();
var cells=graphJSON.cells;
var linkid=“”;
var-rid=“”;
var-eid=“”;

对于(var i=0;iAwesome。谢谢Dave!我维护的代码只是在重新绘制图表时才监控的文件,这些事件也会触发。如果我不想处理这些事件,那么最好的解决方案是unsub/resub吗?@Dave sir你能帮我解决这个问题吗?我没有尝试过这个(我将无法尝试)这可能是我想要的。为了删除一个圆和链接,基于圆是否与其他阶段链接,通过JSON重新映射图形元素GPH,也可以编辑。如果你考虑一个2个圆的图和连接它们之间的链接。如果你点击链接上的删除链接按钮,那么这个Relvivin。k事件将被触发。然后它将询问用户是删除整个流还是唯一的链接,如果在删除流中的现有链接后,该链接与一个没有更多链接的单节点圆圈相关联,则该带有圆圈或节点的链接将被删除。注意,此处的步骤指的是链接。
    paper.on('tool:remove', function(evt, linkView) {
        console.log("Removing link" + linkView.model.id);
        linkView.model.remove();
    })
//deletion of link from  diagram
paper.on('tool:remove', function(linkView, evt) {
    var confirmValue=confirm('Delete Flow ?', function(result) {
    });
    //alert(confirmValue);
    if(confirmValue) {
        var IsDeleteStep=false;
        //check whether user needs to delete the step also
        if(confirm('Do You want to delete the step also ?')){
            IsDeleteStep=true;
        }

        console.log("Removing link" + linkView);
        var pathLabel = linkView.model.attributes.labels[0].attrs.text.text;
        var destLabel=linkView.targetView.model.attributes.attrs[".tooltip"].text;
        if(typeof linkView.sourceView.model.attributes.attrs[".tooltip"] != 'undefined') {
            srcLabel=linkView.sourceView.model.attributes.attrs[".tooltip"].text;
        } else {
            srcLabel="source";
        }



        var graphJSON=gph.toJSON();
        var cells=graphJSON.cells;
        var linkid="";
        var rid="";
        var eid="";
        for(var i=0;i<cells.length;i++) {
            if(typeof cells[i].fid != 'undefined') {
                console.log("new=>"+cells[i].fid.val);
                if(cells[i].fid.val == linkView.model.attributes.fid.val) {
                    linkid = cells[i].id;
                    if(typeof cells[i].eid != 'undefined') {
                        eid = cells[i].eid.val;
                    }
                    if(typeof cells[i].rid !='undefined') {
                        rid = cells[i].rid.val;
                    }                               
                    //rid = cells[i].rid.val;
                    //alert("fid found=>"+cells[i].fid.val);
                }
            }
        }
        var str="";
        var stepId="";
        link=gph.getCell(linkid);

        console.log(link.toJSON().cid);
       // alert("link json=>"+link.toJSON().cid);
        //alert(link.toJSON().cid.cid);
        //alert(link.toJSON().sid.sid);
        if(typeof link.toJSON().cid!='undefined' && 
                typeof link.toJSON().cid.cid!='undefined'){
            stepId=link.toJSON().cid.cid;
        } else {
            stepId=link.toJSON().sid.sid;
        }

        if(link!="") {
            var linkjson=link.toJSON();
            var jid=link.id;

            str+="&linkId="+linkjson["id"];
            var source = gph.getCell(jid).getSourceElement();
            var target = gph.getCell(jid).getTargetElement();

            gph.removeCells([gph.getCell(jid)]);    
            //if target is isolated then target to be deleted
            if(gph.isSink(target)&&gph.isSource(target)) {
                var targetjson=target.toJSON();
                str+="&targetId="+targetjson["id"];
                gph.removeCells([target]);
            }
            var sourceJson = source.toJSON();
            //if source is isolated then src to be deleted &&sourceJson["type"]!="fsa.StartState"
            if(gph.isSink(source)&&gph.isSource(source)) {
                var srcjson=source.toJSON();
                str+="&sourceId="+srcjson["id"];
                gph.removeCells([source]);
            }

            if(eid==""||rid==""){
                return false;
            }

            if(typeof link.toJSON().fid == 'undefined'){
                return false;
            }

            if(IsDeleteStep){
                str+="&stepId="+stepId;
            }

            if(link.attributes.drawnFrom.val=="source"){
                str+="&eid="+eid+"&ruleId="+rid+"&displayViewRule=true";
                str+="&flowId="+linkView.model.attributes.fid.val;
                str+="&jsonDiagram="+JSON.stringify(gph.toJSON());
                window.location.href="ManageRule.action?deleteFlow="+str;
            }
        }   

    } else {
            return false;
          }
    /* 
    var cnfrm=confirm(" Flow ?");
    if(cnfrm) {

    } else {
        return false;
    } */

   // linkView.model.remove();
});