我的问题与此类似:How to prevent itemclick event on check change in Ext Js Tree。
但是,它没有为我的问题提供解决方案。所以,我的问题是:如何在事件发生之前删除监听器?问题是我的树中有三个监听器,checkchange
我希望阻止itemclick
事件。但是一切都以意想不到的顺序执行。代码是:
checkchange:function(node,check){
alert("1");
},
itemclick:function(view,rec,item,index,eventObj){
alert("2");
},
render:function(){
Ext.getCmp('mytree').on('checkchange',function(node,check){
alert("0");
Ext.getCmp('mytree').removeListener('itemclick',this);
});
}
当我检查树中的节点时,我首先看到alert(2)
,然后是alert(1)
,然后才看到alert(0)
。因此,应该删除侦听器的代码发生在最后,我希望相反。
修改
我不想完全删除itemclick
事件。更合适的词是“停止”一个事件,以防止它发生。
修改
解决方案是在itemclick事件中执行e.getTarget()检查。所以,itemclick
事件中的代码现在看起来像这样:
itemclick:function(view, record, item, index, e, eOpts){
if(e.getTarget('span',1,true)){
// all other code which should take place in case
// itemclick event does not come from checkbox element
}
}
答案 0 :(得分:2)
首先,了解订单事件的发生非常重要:
render
itemclick
checkchange
其次,了解您为render
事件定义的函数中发生的事情非常重要。
代码正在做的是为checkchange
函数添加额外代码,因此checkchange
运行时会1
然后0
(你所看到的)。此外,它将删除itemclick
侦听器。这意味着第二次单击节点时,它的行为应该不同。
如果您想在渲染后立即取消itemclick
事件,则应取消嵌套removeListener
调用,因此:
render:function(){
this.removeListener('itemclick',this).on('checkchange',function(node,check){
alert("0");
});
}
或者,您只需删除itemclick
事件侦听器本身。
如果您想更改itemclick
事件的处理方式,您还可以使用以下方法之一截取事件本身:
itemclick:function(view,rec,item,index,eventObj){
eventObj.preventDefault(); //or
eventObj.stopPropagation(); //or
eventObj.stop();
},
然而,目前还不清楚你想要完成什么。