我正在使用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调用将被执行多次。我想我没有正确处理事件,而事件正在累积...对此有任何帮助吗?
答案 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()
});
}
});
}
});
通过首先解除绑定事件,您一次只能触发一个事件:)