1

2つのスクリプトコントロールがあり、一方はもう一方を保持し、次を使用して親の子からのイベントを正常に処理できました。

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

    ....
}

これを行うためのより良い方法はありますか?

4

1 に答える 1

0

DOM要素の「control」expandoプロパティがコントロールオブジェクトを参照する正しい方法であるかどうかはわかりません。それはフレームワークによって管理されており、ご覧のとおり、disposeが呼び出されるまでにすでに変更されていると思います。

$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 =>getcontrolobject」のロジックを「getcontrolobject=>getelement」に反転します。

于 2009-01-09T14:50:17.310 に答える