0

我的问题与此类似: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
  }
}
4

1 回答 1

2

首先,了解触发事件的顺序很重要:

  1. render
  2. itemclick
  3. checkchange

其次,了解您为render事件定义的函数中发生了什么很重要。

代码所做的是向您已经为checkchange函数定义的代码添加额外的代码,因此当它运行时会发出checkchange警报(您所看到的)。此外,它将删除侦听器。这意味着您第二次单击一个节点时,它的行为应该有所不同。10itemclick

如果您想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();
},

但是,尚不清楚您要完成什么。

于 2013-08-08T09:55:04.443 回答