ExtJS 4.1:模态窗口似乎在提交窗口之前返回控件

时间:2013-07-23 07:13:09

标签: extjs extjs4.1

我不确定如何在问题标题中描述我的问题。但这是我的问题:

(a)当我双击Ext.grid.Panel中的一行时,我打开一个模态窗口,其中包含相关详细信息以更新记录。

(b)在我进行必要的修改并关闭模态窗口之后,我想返回网格,网格过滤了某个代码,即selectedSalesOrderNum。

jobSlotsGrid.on('celldblclick', function(tableview, td, cellIndex, record, tr, rowIndex, e, eOpts){
    modalStatus = loadWindow();
    jobSlotStore.filterBy(function(rec) {
        alert('Filtering data');
        return  rec.get('salesOrderNum') === selectedSalesOrderNum;
    });
});

(c)下面是创建模型窗口的函数。它还调用方法submitCreateJobSlotHandler(),它基本上保存了更改并使用所有数据重新加载原始Grid。 (因此必须使用某个代码将其过滤回来,即selectedSalesOrderNum)。

function loadWindow()
{
        getAllTabsForEditJobSlot();   
        var createJobSlotWin = new Ext.Window({
        id:'salesOrder-win-jobSlot',
        applyTo     : 'hello-win',
        modal       : true,
        layout      : 'fit',
        width       : 900,
        height      : 500,
        closeAction :'destroy',
        plain       : true,
        model       : true,
        stateful    : false,
        title       :'Create Job Slot',
        items       : [editJobSlotInformationPanel],
        buttons     : [{
        text        : 'Save',
        handler     : function(){
            submitCreateJobSlotHandler();           
            //createJobSlotWin.destroy();
        }        
        },{
        text     : 'Close',
        handler  : function(){
        createJobSlotWin.destroy();
        }
        }] 
    });
        createJobSlotWin.show();    
}

问题:

在第一个代码块中,只要调用loadWindow方法,就会弹出一个模态窗口,并且filterBy代码会并行执行并显示警报('过滤数据')。然后我在模态中输入数据并保存。因此,基本上,在模态上保存/关闭后不会进行过滤。加载模态窗口后立即到达代码(if / else)。好像,模态窗口打开并转到下一行代码,等待用户稍后在模态窗口上执行某些操作。

希望我对我的问题很清楚。有人可以建议我如何处理这个问题?

修改

我现在想的越多,我想loadWindow()方法只是创建模态窗口,因为我们刚刚有一个新的Ext.Window()调用,并且不会打扰模态中的其他用户操作并返回控制。因此,立即执行后续的filterBy事件。在这种情况下,我想在Save in Modal Window中重新加载商店后过滤商店。 Modal窗口上的保存具有以下处理程序代码:

function submitCreateJobSlotHandler () {
    alert('Into Submit');
    var formPanel = Ext.getCmp('salesOrderJobSlotForm');
    formPanel.getForm().submit({
        url : 'someUrl',
        method : 'POST',
        success : function() {
            alert('Success');
            jobSlotStore.load({
                scope : this,
                url : 'salesOrderJobSlot/listJSON'
            });
            jobSlotStore.filterBy(function(rec) {
                alert(rec.get('salesOrderNum')+"--"+selectedSalesOrderNum)
                return  rec.get('salesOrderNum') === selectedSalesOrderNum;
            });
        },
        failure : function() {
            alert('PSO save failed!');
        }

    });
}

但是这里的问题是,jobSlotStore.load()虽然被调用,但它一直保持到filterBy被执行为止。因为,我看到警报一个接一个地出现,然后在所有警报完成后,商店加载。因此,filterBy会被'迟'的商店负载覆盖。

有任何建议以任何方式处理该问题吗?

1 个答案:

答案 0 :(得分:2)

存储加载是异步的,您需要等到它完成才能过滤客户端上的数据集:

store.on('load', function() {
    store.filter();
}, null, {single: true});
store.load();