Cytoscapejs事件的复合拖放扩展

时间:2019-04-16 08:12:40

标签: cytoscape.js

我正在使用cytoscapejs和扩展化合物拖放。我的目的是当我将一个节点拖放到另一个节点上时,将事件拍摄到数据库中。我使用cdndtapstart或cdndout(当它在复合节点中时)和event.target._private.data.id来获取(我未来的子节点的)id,然后使用cdnddrop调用dropSibling._private.data.id ,并使用此数据可以进行ajax调用。 我遇到的问题是,这些事件在另一个事件之间累积,如果我一次拖动该节点很好,第二次将其拖动,它将产生两个ajax调用,第三次将给我三个调用。有办法避免这种情况吗?还是应该将其报告为错误?

cy.on('cdndout', 'node', function(event, dropTarget, dropSibling){
    let type = event.target._private.data.type;
    let id = event.target._private.data.id;
    let gId = event.target._private.data;

    if(type == 'device'){
      cy.on('cdnddrop', function(event, dropTarget, dropSibling){
        var typeDe = dropSibling._private.data
        if(typeDe == undefined){
          $.notify({message: err},{type: 'danger'});
          createGraph()
        } else {
          let uuid = event.target._private.data.id;
          let gId = dropSibling._private.data.id;
          setResourceToGroup(uuid, gId, cb)
          .then(reso => getAllResources())
          .then(allReso => createGraph())
          .catch(err => {
            $.notify({message: parseLog(err)},{type: 'danger'});
            createGraph()
          })
        }
      })
    } 
})

因此,使用此代码,在我拖动节点时,我在setResourceToGroup函数中进行的ajax调用将被执行多次。我想我没有正确处理事件,而事件正在累积...对此有任何帮助吗?

1 个答案:

答案 0 :(得分:1)

cytoscape.js中的事件非常简单,您绑定一个事件,并在满足绑定事件的条件时触发该事件。当您两次或更多次调用同一绑定操作时,问题就开始了。这样您的事件便可以正常工作,但是您再次调用该绑定后,您手上就有2个事件。他们会同时射击两个!那你怎么解决呢?

每次调用cy.bind()(cy.bind()与cy.on()相同)时,都必须评估该行是否可以执行多次。如果是,那么您必须这样做:

cy.unbind('cdnout');
cy.bind('cdndout', 'node', function(event, dropTarget, dropSibling){
    let type = event.target._private.data.type;
    let id = event.target._private.data.id;
    let gId = event.target._private.data;
    if(type == 'device'){
      cy.unbind('cdnddrop);
      cy.bind('cdnddrop', function(event, dropTarget, dropSibling){
        var typeDe = dropSibling._private.data
        if(typeDe == undefined){
          $.notify({message: err},{type: 'danger'});
          createGraph()
        } else {
          let uuid = event.target._private.data.id;
          let gId = dropSibling._private.data.id;
          setResourceToGroup(uuid, gId, cb)
          .then(reso => getAllResources())
          .then(allReso => createGraph())
          .catch(err => {
            $.notify({message: parseLog(err)},{type: 'danger'});
            createGraph()
          });
        }
      });
    } 
});

通过首先解除绑定事件,您一次只能触发一个事件:)