我有两个脚本控件,一个持有另一个,我已经成功地使用以下方式处理来自父级子节点的事件:
initialize: function()
{
this._autoComplete = $get(this._autoCompleteID);
this._onAutoCompleteSelected = Function
.createDelegate(this, this.handleAutoCompleteSelected);
var autoControl = this._autoComplete.control;
autoControl.addItemSelected(this._onAutoCompleteSelected);
...
}
addItemSelected(在孩子上)是:
addItemSelected: function(handler)
{
list = this.getEvents();
list.addHandler('userItemSelected', handler);
},
和getEvents是:
getEvents: function()
{
if (this._events == null)
{
this._events = new Sys.EventHandlerList();
}
return this._events;
},
问题是,在处理父母时,我想做同样的事情:
dispose: function()
{
var autoControl = this._autoComplete.control;
autoControl.removeItemSelected(this._onAutoCompleteSelected);
...
}
但是,.control不再存在。我猜这是因为子控件已被处理,因此.control属性不再起作用。
鉴于此,我决定运行子项上的事件列表并删除其中的所有事件处理程序。
dispose: function()
{
list = this.getEvents();
for(var item in list._list)
{
var handler;
handler = list.getHandler(item);
list.removeHandler(item, handler);
}
....
}
有更好的方法吗?
答案 0 :(得分:0)
我不确定DOM元素上的“control”expando属性是引用控件对象的正确方法。它是由框架管理的,正如您所看到的,我认为在您处理此类部署时它已经被提供了。
您是否尝试过使用$find
代替$get
并以这种方式重新修改参考文件?:
initialize: function()
{
this._autoControl = $find(this._autoCompleteID);
this._onAutoCompleteSelected = Function
.createDelegate(this, this.handleAutoCompleteSelected);
this._autoControl.addItemSelected(this._onAutoCompleteSelected);
}
dispose: function()
{
this._autoControl.removeItemSelected(this._onAutoCompleteSelected);
this._autoControl = null;
}
哦,是的,你引用this._autoComplete
中存储的DOM元素的地方你改为通过控制对象本身:
this._autoControl.get_element();
所以基本上将“get element => get control object”的逻辑反转为“get control object => get element”。