1

在此处输入代码我有一个窗口,其中有一个带有触发字段的表单。所以通过触发我的意思是,如果我从第一个组合中选择一个值,它会用它们的第一个值触发后续组合。当我第一次打开窗口时,这工作正常。但是如果关闭它并第二次打开它,它会产生错误,因为 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);
    });
}
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 回答