如果没有在dojo.connect期间返回的"句柄",如何删除dojo连接事件?

Bea*_*ear 13 dojo event-handling disconnect

如果没有在dojo.connect期间返回的"句柄",如何删除dojo连接事件?

我的例子涉及动态地将一组事件分配给一组对象.(为简单起见,事件是onclick和ondblclick,对象是表中的行)

因此,在页面设置期间,事件连接到每一行(onclick,ondblclick).现在,根据用户的期望/动作,需要从一行中删除一个事件.但原来的手柄已不再可用.因此,以下内容不起作用: dojo.disconnect(row, "onclick", ??*).如何在不破坏原始行结构的情况下解决这个问题?

任何帮助当然非常感谢.

xAp*_*ple 10

您的问题的答案是,如果您丢失了在dojo.connect操作期间返回的"句柄",则无法断开事件.除非你准备好对dojo代码进行大量的黑客攻击.

如果您希望稍后断开它们,则必须将它们存储在某处.


Eug*_*kin 9

像Seth一样,我有删除事件的模式 - 我收集数组中的句柄(伪代码):

var handles = [
  dojo.connect(...),
  dojo.connect(...),
  dojo.connect(...)
];
Run Code Online (Sandbox Code Playgroud)

如果我动态连接,我只需收集它们:

var handles = [];
...
handles.push(dojo.connect(...));
...
handles.push(dojo.connect(...));
Run Code Online (Sandbox Code Playgroud)

如果我以常规方式连接多个事件,我可以使用dojo.map():

var handles = dojo.map(["click", "ondblclick"], function(evt){
  return dojo.connect(node, evt, ...);
});
Run Code Online (Sandbox Code Playgroud)

整洁的部分是,以后我可以用一个方便的单线程来断开它们:

dojo.forEach(handles, dojo.disconnect);
Run Code Online (Sandbox Code Playgroud)

在您的情况下,您可以使用Seth所示的字典来完成相同的操作:

var handles = {};
...
handles[node.id] = dojo.map(["click", "ondblclick"], function(evt){
  return dojo.connect(node, evt, ...);
});
Run Code Online (Sandbox Code Playgroud)

所以稍后您可以断开这样的处理程序:

dojo.forEach(handles[node.id], dojo.disconnect);
Run Code Online (Sandbox Code Playgroud)

看看Seth'和我的草图是否有助于您的情况.如果没有,请提供更多详细信息.


set*_*eth 8

我通常做的是在创建手柄时保存手柄,以便稍后断开它们.就像是:

 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) { .... });
 });
Run Code Online (Sandbox Code Playgroud)

然后,你可以断开像:

 dojo.forEach( connects[node.id], function( handle ) {
   dojo.disconnect( handle );
 });
Run Code Online (Sandbox Code Playgroud)

dojocampus上有类似的代码示例