ExtJS removeAll 不起作用

ExtJS removeAll doesn't work

我检测到 removeAll 有一个奇怪的行为。我正在使用 ExtJS 4.2,我不知道在其他较新的版本中是否也会发生同样的情况。 我在网格的 tbar 中有这段代码:

{
itemId: 'delete',
text: 'Delete',
iconCls: 'icon-delete',
disabled: true,
handler: function() {
    var selection = this.up('grid').getView().getSelectionModel().getSelection()[0];
    if (selection) {
        var numItems = storeProdutos.data.items.length;
        var store = this.up('grid').getStore();
        if(numItems != 0) {
            // point 2
            Ext.Msg.confirm('Confirm', 'Do you want to delete?', function(button){
                if(button === 'yes') {
                    gridProduto.getStore().removeAll();
                    store.remove(selection);
                    gridProduto.getStore().clearFilter();
                    gridProduto.getStore().load();
                    gridMercado.getSelectionModel().select(0);
                }
            });
        } else {
            store.remove(selection);
            gridProduto.getStore().clearFilter();
            gridProduto.getStore().load();
            gridMercado.getSelectionModel().select(0);
        }
    }
}
}

当我尝试删除时出现消息框,我同意了。
然后它会删除 store.remove(selection) 但不会删除 gridProduto.getStore.removeAll()。奇怪的是,在 php 删除脚本中,一切都成功了。
最奇怪的是,如果我将 gridProduto.getStore.removeAll() 放在代码的 point 2 上并再次执行所有操作,它会成功删除所有内容!
我相信这与消息框有关。
有谁知道我该如何解决这个问题?

PS: 我的商店有一个删除代理 ajax。像这样:

storeProdutos = Ext.create('Ext.data.Store',{
...
proxy: {
            type: 'ajax',
            api: {
                destroy: '/path/someScript.php'
            }
}
}

我猜你将 autoSync 设置为 true,因为你没有在任何地方调用 sync()。

问题是 sync(由 removeAll 触发)和 load 操作的时间。如果将 removeAll 放入点 2,则 removeAll 将在您单击消息框(然后触发 load )之前执行并完成。但是在它所在的位置,您开始了两个 Ajax 调用:removeAll 调用和 load 调用 - 同时进行。由于商店默认以异步方式启动调用,因此仅执行最后一个调用。

您可以通过同步创建存储来解决此问题,我认为这是一种 hack,或者更好的方法是从存储中删除 autoSync 并仅从删除回调中加载,如下所示:

gridProduto.getStore().removeAll();
gridProduto.getStore().sync({
    callback:function() {
        store.remove(selection);
        gridProduto.getStore().clearFilter();
        gridProduto.getStore().load();
        gridMercado.getSelectionModel().select(0);
    }
});