“ハンドル”がない場合、どうやって道場接続イベントを削除しますか? dojo.connect中に返されましたか?
-
06-07-2019 - |
質問
" handle"がない場合、どうやってdojo connectedイベントを削除しますか? dojo.connect中に返されましたか?
私の例では、一連のイベントを一連のオブジェクトに動的に割り当てます。 (簡単にするために、イベントはonclickとondblclickであり、オブジェクトはテーブル内の行です)
したがって、ページ設定中にイベントは各行に接続されます(onclick、ondblclick)。現在、ユーザーの希望/アクションに応じて、1つの行から1つのイベントを削除する必要があります。しかし、元のハンドルは使用できなくなりました。このため、次は機能しません: dojo.disconnect(row、" onclick&quot ;, ?? *)
。元の行構造をハッキングせずにこれを回避するにはどうすればよいですか?
もちろん、どんな助けも大歓迎です。
解決
通常は、作成時にハンドルを保存して、後で切断できるようにします。次のようなもの:
var connects = {};
// then later on
var node = dojo.create(....); // or someting else that gives you a node
dojo.forEach( ['click','ondblclick' ], function( evt, idx ) {
if (!connects[node.id]) {
connects[node.id] = [];
}
connects[ node.id ][idx] = dojo.connect( node, evt, function(evt) { .... });
});
その後、次のように切断できます:
dojo.forEach( connects[node.id], function( handle ) {
dojo.disconnect( handle );
});
に同様のコードサンプルがあります。 他のヒント
あなたの質問に対する答えは、「ハンドル」を失った場合、イベントを切断することは不可能だということです。 dojo.connect操作中に返されました。 dojoコード自体の激しいハッキングを行う準備ができている場合を除きます。
後で切断する場合は、これらをどこかに保存する必要があります。
セスのように、イベントを削除するパターンがあります—配列でハンドルを収集します(疑似コード):
var handles = [
dojo.connect(...),
dojo.connect(...),
dojo.connect(...)
];
動的に接続する場合、それらを収集するだけです:
var handles = [];
...
handles.push(dojo.connect(...));
...
handles.push(dojo.connect(...));
定期的に複数のイベントを接続する場合、 dojo.map()
を使用できます:
var handles = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
きちんとした部分は、後で便利なワンライナーでそれらをすべて切断できることです:
dojo.forEach(handles, dojo.disconnect);
あなたの場合、Sethが示すような辞書を使用して同じことを実現できます。
var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
return dojo.connect(node, evt, ...);
});
したがって、後でこのようなハンドラを切断できます:
dojo.forEach(handles[node.id], dojo.disconnect);
Seth 'と私のスケッチがあなたの場合に役立つかどうかを確認してください。そうでない場合は、詳細をお知らせください。
dojoにはこれを行う方法はありませんが、標準JavaScriptを使用して名前付き関数を削除できます。
node.removeEventListener ("click", clickFunction, false);
実際の動作を見る。ただし、removeEventListenerはInternet ExplorerのIE9以降でのみサポートされます。他のすべての主要なブラウザーで動作するはずです。
イベントがDijitウィジェットに接続されている場合、次のようにイベントのすべてのハンドラーをオーバーライドできます。
dijit.byId(widgetid).onClick = function() {
// click handler or empty function goes here
}
そのウィジェットの click
ハンドラーに関連付けられているすべての関数は、新しいクリックハンドラーに置き換えられます。