ExtJS removeAll не работает

Я обнаружил странное поведение 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() на точку 2 кода и повторите все снова, он успешно удаляет все!
Я считаю, что это как-то связано с окном сообщений.
Кто-нибудь знает, как я могу это исправить?

PS: В моем магазине есть прокси для удаления с помощью ajax. Что-то вроде этого:

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

person alexandre1985    schedule 13.05.2016    source источник


Ответы (1)


Я предполагаю, что для autoSync установлено значение true, потому что вы нигде не вызываете sync().

Тогда проблема заключается в синхронизации операций sync (запускается по команде removeAll) и load. Если вы поместите removeAll в точку 2, removeAll будет выполнено и завершено до того, как вы сможете щелкнуть окно сообщения (которое затем вызывает load). Но там, где он есть, вы запускаете два вызова Ajax: вызов removeAll и вызов load — оба одновременно. Поскольку хранилища по умолчанию запускают вызовы асинхронно, выполняется только последний из вызовов.

Вы можете решить эту проблему, либо сделав хранилище синхронным, что я считаю хаком, либо, что лучше, удалив автосинхронизацию из хранилища и загружая только из обратного вызова удаления, например:

gridProduto.getStore().removeAll();
gridProduto.getStore().sync({
    callback:function() {
        store.remove(selection);
        gridProduto.getStore().clearFilter();
        gridProduto.getStore().load();
        gridMercado.getSelectionModel().select(0);
    }
});
person Alexander    schedule 13.05.2016
comment
Могу ли я оставить для autoSync значение true и выполнить синхронизацию в любом случае? - person alexandre1985; 14.05.2016