Javascript/Ajax - вручную удалить обработчик событий из Sys.EventHandlerList()

У меня есть два скрипта управления, один содержит другой, и я успешно смог обработать события от дочернего на родительского с помощью:

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);
    }

    ....
}

Есть лучший способ сделать это?

1 ответ

Я не уверен, что свойство элемента управления "control" элемента DOM является правильным способом ссылки на объект управления. Он управляется фреймворком, и, как вы видите, я думаю, что он уже исправлен к тому моменту, когда ваше распоряжение вызвано.

Вы пытались использовать $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;
}

Ах да, и где вы ссылаетесь на элемент DOM, хранящийся в this._autoComplete вместо этого вы проходите сам объект управления:

this._autoControl.get_element();

Таким образом, в основном инвертируйте логику "get element => get control object" в "get control object => get element".

Другие вопросы по тегам