ドキュメントのクリックイベントでコンテンツを非表示にするポップオーバーコンポーネントがあります。私のロジックは次のようになります: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を配布することができますかどうかはわかりませんインスタンス。
ハンドラ関数に、それは最初のが間違った場所をクリックした場合、イベントではなく、リスナーを削除するのでは無視されますが、1つのオプションは、クリックが発生するたびに削除されます、クリックが発生した場所を決定する必要があるため、これは彼のために正常に動作しません。ドキュメント内のどこにいても、ユーザーは間違いなく欲しいと思うでしょう:) –
隠す必要のあるコンポーネントに直接リスナーを置かないのはなぜですか? – dbrin