2012-03-22 2 views
0

ドキュメントのクリックイベントでコンテンツを非表示にするポップオーバーコンポーネントがあります。私のロジックは次のようになります:Extjsドキュメントのクリックイベント

show : function() { 
    var me = this; 

    if (me.visible) { 
     return; 
    } 


    Ext.getDoc().on('click', function handleDocClick(e) { 

     if (e.within(me.el)) { 
      return; 
     } 

     if (me.isVisible() && !e.within(me.divEl)) { 
      me.hide(); 
      Ext.getDoc().un('click', handleDocClick); 
     } 
    }); 

    var cfg = me.determineLocation();  
    me.setLocation(cfg); 

    me.visible = true; 
}, 

hide : function() { 
    this.visible = false; 
      ......... 
}, 

popoverコンポーネントの非表示メソッドの呼び出しに問題があります。そうすることで、イベントが効果的に巻き戻され、メモリリークが発生します。

私はこのような結合事象を変更しようとしました:

Ext.getDoc().on('click', Ext.bind(this.handleDocClick, this)); 

と非表示にする:

hide : function() { 
    Ext.getDoc().un('click', Ext.bind(this.handleDocClick, this)); 
    this.visible = false; 
      ......... 
}, 

が、イベントが正常に再びくつろぐされていないので、これはあまり助けにはなりませんでした。

私の質問は、どのように問題を解決するかです。最善の解決策は、次のようになります。

Ext.getDoc().un('click', functionClick); 
Ext.getDoc().on('click', functionClick); 

と非表示にする::ショーで

Ext.getDoc().un('click', functionClick); 

私はグローバルスコープでさえ機能を受け入れることができますが、私は、私は、オブジェクトからのparamsを配布することができますかどうかはわかりませんインスタンス。

答えて

0

私はあなたがアンワインドで何を意味するかわからないが、あなたは一度だけ実行して、リスナーが削除され、このイベントを持つようにしようとしているように聞こえます。この場合、ExtJSの観察可能なAPIは、リスナーのために含めるオプションがあります。

単一

:イベントのすぐ隣の発射を処理するためのハンドラを追加する場合はTrue

ブール

、および はその後、自分自身を削除します。 http://docs.sencha.com/ext-js/4-0/#!/api/Ext.util.Observable-method-on

ご希望のものをお選びください。

+0

ハンドラ関数に、それは最初のが間違った場所をクリックした場合、イベントではなく、リスナーを削除するのでは無視されますが、1つのオプションは、クリックが発生するたびに削除されます、クリックが発生した場所を決定する必要があるため、これは彼のために正常に動作しません。ドキュメント内のどこにいても、ユーザーは間違いなく欲しいと思うでしょう:) –

+0

隠す必要のあるコンポーネントに直接リスナーを置かないのはなぜですか? – dbrin

関連する問題