2016-05-13 13 views
0

Ich habe ein seltsames Verhalten von removeAll festgestellt. Ich benutze ExtJS 4.2, ich weiß nicht, ob das auch in anderen neueren Versionen passiert. Ich habe diesen Code innerhalb eines TBAR eines Gitters:ExtJS removeAll funktioniert nicht

{ 
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); 
     } 
    } 
} 
} 

Wenn ich versuche, löschen sie die messagebox erscheint, und das sage ich ja.
Dann löscht es die store.remove (Auswahl), aber es löscht nicht die gridProduto.getStore.removeAll(). Das Seltsame ist, dass im php delete Skript alles erfolgreich verlaufen ist.
Die seltsamste Sache ist, dass, wenn ich gridProduto.getStore.removeAll() auf Punkt 2 des Codes setzen und alles wieder tun, entfernt esAll erfolgreich!
Ich glaube, es hat etwas mit der Messagebox zu tun.
Weiß jemand wie ich das beheben kann?

PS: Mein Geschäft hat einen Proxy zum Löschen mit Ajax. So etwas wie dieses:

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

Antwort

1

Ich denke, Sie haben autoSync auf True eingestellt, weil Sie nirgends sync() aufrufen.

Das Problem ist dann das Timing auf sync (ausgelöst durch removeAll) und load Operation. Wenn Sie removeAll in Punkt 2 eingeben, wird removeAll ausgeführt und beendet, bevor Sie auf das Meldungsfeld klicken können (das dann die load auslöst). Aber wo es ist, starten Sie zwei Ajax-Anrufe: die removeAll Anruf und die load Anruf - beide zur gleichen Zeit. Da Stores die Aufrufe standardmäßig asynchron starten, wird nur der letzte der Aufrufe ausgeführt.

Sie können dieses Problem lösen, indem entweder die Speicher synchron zu machen, die ich einen Hack betrachten, oder besser, durch die autoSync aus dem Laden und Laden nur aus dem Entfernen Rückruf wie folgt zu entfernen:

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

kann ich Lassen Sie autoSync auf "True" und führen Sie eine Synchronisierung durch? – alexandre1985

+0

Ich kann. Ich habe das http://stackoverflow.com/a/32391211/1930275 gefunden – alexandre1985