当我在第二次加载窗口时使用on load事件触发字段时,我得到me.store.loading是未定义的

时间:2013-11-06 13:24:21

标签: extjs

在这里输入代码我有一个窗口,其中有一个带触发字段的表单。因此,通过trigerring我的意思是,如果我从第一个组合中选择一个值,它将使用他们的第一个值来驱动成功的组合。这是第一次打开窗口时工作正常。但如果关闭它并第二次打开它,它将产生错误,因为me.store.loading未定义。

我正在使用组合的加载事件来使用其第一个值触发下一个组合。请参阅下面的代码,我在该窗口中放置了一个字段的渲染事件。

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

1 个答案:

答案 0 :(得分:0)

商店何时被创建/销毁?您是使用每个组合框创建新商店还是每次都重复使用全局商店?

在上面的评论中,我为您提供了一种排查方法,但如果您反复使用同一商店对象,则需要使用managed listener(首选)或取消注册处理程序组合框被销毁。

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

假设情况确实如此,那么您的商店和组合框的生命周期就会断开。听众与商店的生命周期联系在一起,后者无法看到组合框的生命周期。因此,旧的监听器不会被删除,直到商店被销毁,这显然是坏的 - 由于许多原因 - 但由于关闭引用了一个被破坏的组合框而导致你的异常。

托管侦听器通过将侦听器的生命周期绑定到组合框而不是存储来解决此问题。