网格刷新:为什么在提交表单之前加载Store?

时间:2013-07-22 23:08:33

标签: extjs extjs4 extjs4.2

我有一个将对象添加到网格的表单。我的网格连接到具有代理的商店。我正在通过代理向我的数据库中添加新条目。我可以成功创建新条目,但我无法及时更新我的​​网格。这是我的表单中的提交按钮:

buttons: [{
        text: 'Submit',
        formBind: true, /* only enabled once the form is valid*/
        handler: function() {
            var form = this.up('form').getForm()
            if(form.isValid()) {
                form.submit()
            }
            Ext.getCmp('grid').getStore().load({
                callback: function(records, operation, success) {
                    console.log(records);
                }
            })
        }
    }]

当我在我的应用中运行时,在我查看Chrome开发工具中的网络请求顺序时,会在提交表单之前调用加载请求。当我再次按下提交按钮时,网格会刷新显示我的所有数据加上之前添加的条目,但不会显示刚刚添加的条目。因此,我的网格始终是同步中的一个请求。

我尝试过调用sync()并在Grid的商店中调用load(),但无济于事。 According to what I've read though,load()应足以更新我的网格。我认为请求的顺序是什么搞乱了,但我不知道如何解决它......

非常感谢任何见解。

2 个答案:

答案 0 :(得分:2)

有一种方法可以确保在form.submit()之后调用load,就像调用它一样:

myForm.getForm().submit({

    success: function(form, action) {
       store.load();
    }

});

话虽如此,我认为你的代码中的form.submit()应该在store.load()之前调用。您是否尝试过使用chrome进行调试以查看首先执行的操作?

答案 1 :(得分:1)

'submit'方法是异步的,这意味着它不会停止处理程序方法中后续行的执行。在向服务器提交提交请求之后,商店正在加载记录。因此,这两个操作不相关,第二个操作可以在第一个操作数据库之前完成(取决于您的服务器业务规则)。更新操作往往会产生更多成本。

上面的答案中提到的这个表单的“成功”方法采用了一个配置对象。通过在“成功”方法中放置任何代码(还有其他方法:失败,回调,...查看文档),确保进行第一次操作,然后就可以安全地加载网格。

Ext.data包中的几乎所有方法都是异步的。