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);
}
});
我检测到 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);
}
});