0

私の質問は次のようなものです: How to prevent itemclick event on check change in Ext Js Tree .

しかし、それは私の問題の解決策を提供しません。私の質問は、イベントが発生する前にリスナーを削除するにはどうすればよいですか? 問題は、ツリーに 3 つのリスナーがあり、イベント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、実行するとアラートが表示され1ます0(表示されているもの)。さらに、itemclickリスナーを削除します。これは、ノードを 2 回目にクリックすると、異なる動作をすることを意味します。

レンダリングの直後にイベントを抑制したい場合は、呼び出し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 に答える