Bea*_*ear 13 dojo event-handling disconnect
如果没有在dojo.connect期间返回的"句柄",如何删除dojo连接事件?
我的例子涉及动态地将一组事件分配给一组对象.(为简单起见,事件是onclick和ondblclick,对象是表中的行)
因此,在页面设置期间,事件连接到每一行(onclick,ondblclick).现在,根据用户的期望/动作,需要从一行中删除一个事件.但原来的手柄已不再可用.因此,以下内容不起作用: dojo.disconnect(row, "onclick", ??*)
.如何在不破坏原始行结构的情况下解决这个问题?
任何帮助当然非常感谢.
xAp*_*ple 10
您的问题的答案是,如果您丢失了在dojo.connect操作期间返回的"句柄",则无法断开事件.除非你准备好对dojo代码进行大量的黑客攻击.
如果您希望稍后断开它们,则必须将它们存储在某处.
像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'和我的草图是否有助于您的情况.如果没有,请提供更多详细信息.
我通常做的是在创建手柄时保存手柄,以便稍后断开它们.就像是:
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上有类似的代码示例
归档时间: |
|
查看次数: |
11070 次 |
最近记录: |