1

ここにコードを入力してくださいトリガー フィールドを含むフォームを含むウィンドウがあります。つまり、最初のコンボから値を選択すると、最初の値で後続のコンボがトリガーされます。初めてウィンドウを開いたとき、これは正常に機能しています。ただし、閉じてもう一度開くと、me.store.loading が定義されていないため、エラーが発生します。

コンボの on load イベントを使用して、最初の値で次のコンボを起動しています。そのウィンドウ内のフィールドのレンダリング イベントに挿入した以下のコードを参照してください。

ありがとう、sj

me.control({
'addinp #renderCmp':{
                    render:me.registerTriggerCalls
                  }
})

registerTriggerCalls : function() {

var stcombo = Ext.getCmp('StField');
    stcombo.store.on('load', function(store, record, opts)
    {debugger;
        if (store.totalCount <= 0)
        { return; }

        stcombo.setValue(store.getAt(0).data.stThru);
        stcombo.fireEvent('select', stcombo);
    });



    var adcombo = Ext.getCmp('AdField');
    adcombo.store.on('load', function(store, record, opts)
    {
        if (store.totalCount <= 0)
        { return; }

        adcombo.setValue(store.getAt(0).data.adDate);
        adcombo.fireEvent('select', adcombo);
    });
}
4

1 に答える 1

0

ストアはいつ作成/破棄されますか? コンボ ボックスごとに新しいストアを作成していますか、それともグローバル ストアを毎回再利用していますか?

上記のコメントでトラブルシューティングの方法を説明していますが、同じストア オブジェクトを何度も再利用している場合は、マネージ リスナーを使用する(推奨) か、コンボ ボックスが破棄されたときにハンドラーを登録解除する必要があります。

var stcombo = Ext.getCmp('StField');
stcombo.mon(store, 'load', function(store, record, opts)
{
    if (store.totalCount <= 0)
    { return; }

    stcombo.setValue(store.getAt(0).data.stThru);
    stcombo.fireEvent('select', stcombo);
});

var adcombo = Ext.getCmp('AdField');
adcombo.mon(store, 'load', function(store, record, opts)
{
    if (store.totalCount <= 0)
    { return; }

    adcombo.setValue(store.getAt(0).data.adDate);
    adcombo.fireEvent('select', adcombo);
});

その場合、何が起こっているかというと、ストアとコンボ ボックスの寿命が切れているということです。リスナーはストアの寿命に結び付けられており、コンボ ボックスの寿命は見えません。したがって、ストアが破棄されるまで古いリスナーは削除されませんが、これは明らかに悪いことですが、多くの理由で、クロージャーが破棄されたコンボボックスを参照するため、例外が発生します。

管理されたリスナーは、基本的にリスナーの寿命をストアではなくコンボ ボックスに結び付けることで、これを解決します。

于 2013-11-08T08:15:13.037 に答える