2011-10-24 14 views
9

Używam ExtJS 4 i mają Ext.data.Store z ajax pełnomocnika i API:Anuluj store.remove po wywołaniu serwera w ExtJS 4

var gridStore = Ext.create('Ext.data.Store', { 
    autoSync: true, 
    proxy: { 
     type: 'ajax', 
     api: { 
      read: 'myurl', 
      create: 'myurl', 
      update: 'myurl', 
      destroy: 'myurl' 
     }, 
     reader: { 
      type: 'json', 
      successProperty: 'success', 
      root: 'data', 
      messageProperty: 'message' 
     }, 
     writer: { 
      type: 'json', 
      writeAllFields: false, 
      root: 'data' 
     }, 
     listeners: { 
      exception: function(proxy, response, operation){ 
       Ext.MessageBox.show({ 
        title: 'Server error', 
        msg: operation.getError(), 
        icon: Ext.MessageBox.ERROR, 
        buttons: Ext.Msg.OK 
       }); 
      } 
     } 
    ... 

Kiedy korzystać z funkcji aktualizacji i mój serwer zwraca obiekt json z success:false (ponieważ wprowadził coś nieprawidłowego) pole w mojej powiązanej siatce jest nadal oznaczone jako zmienione, a użytkownik ma możliwość zmiany swojej niewłaściwej wartości.

To działa dobrze.

Ale kiedy wyjąć płytę ze sklepu ...

var store = Ext.StoreManager.lookup('gridStore'); 
store.remove(store.getById(id)); 

... ExtJS następnie usuwa tę płytę ze sklepu pierwszy i wywołać ajax api później. Więc kiedy niszczy api zwróci success:false, wiadomość zostanie pokazana jako wyjątek, jak w api aktualizacji, to w porządku, ale mój rekord został usunięty ze sklepu! Przykład: wyjątek od serwera mówi, że nie można usunąć tego rekordu z powodu czegokolwiek, ale został już usunięty ze sklepu.

Jak anulować usuwanie sklepu po synchronizacji serwera? Chcę, aby rekord pozostał w sklepie, jeśli serwer zwróci success:false.

Każdy pomysł? Może błąd?


UPDATE ROZWIĄZANIE

podstawie anwer Ryana, I zmodyfikowane słuchacza wyjątek jako następujące, które działa bardzo dobrze:

listeners: { 
    exception: function(proxy, response, operation){ 
     Ext.MessageBox.show(...); 
     // get the removed records and insert them where they have been 
     var removedRecords = gridStore.getRemovedRecords(); 
     for(var i=0; i<removedRecords.length; i++){ 
      var record = removedRecords[i]; 
      gridStore.insert(record.index, record); 
     } 
    } 
} 
+0

Prawdopodobnie błąd lub potrzeba zagłębienia się w kod źródłowy, aby zobaczyć, co się stanie. Hmm. Interesujące pytanie. Widziałem to już wcześniej, ale pokonałem to przez ponowne załadowanie sklepu. Nieefektywne, ale w przypadku małych danych jest w porządku. –

+3

Przyjemnie :) Ale zapomniałeś dodać 'gridStore.removed = []' else jeśli usuniesz ten element ponownie, będziesz miał duplikaty (wtedy nadal jest w usuniętej tablicy) – VDP

Odpowiedz

5

Wystarczy rozszerzenie kodu dałeś, a konkretnie listeners obszar:

listeners: { 
     exception: function(proxy, response, operation){ 
      Ext.MessageBox.show({ 
       title: 'Server error', 
       msg: operation.getError(), 
       icon: Ext.MessageBox.ERROR, 
       buttons: Ext.Msg.OK 
      }); 
      gridStore.add(gridStore.getRemovedRecords()); 
     } 
    } 
+0

Dziękuję bardzo, to jest poprawny sposób. Zmieniłem trochę twoje rozwiązanie, spójrz na moje zaktualizowane pytania, ponieważ po dodaniu rekordów są one dodawane na końcu listy, ale powinny pozostać tam, gdzie były wcześniej. – Marc

2

Używam model.destroy, to co ja używać do usuwania pojedynczej wpisy z siatki:

   text : 'Delete', 
       itemId : 'delete', 
       scope : this, 
       handler : function() { 
        var selection = grid.getView().getSelectionModel().getSelection()[0]; 
        if(selection) { 
         selection.destroy({ 
          failure : function() { 
           console.log('Record could not be deleted.'); 
          }, 
          success : function() { 
           store.remove(selection); 
           console.log('Record successfuly removed.'); 
          }, 

         }); 
        } 
       } 
+0

ładny. nadaje się tylko do pojedynczego zapisu. –

6

technika Wkładka nie działa dla mnie, usunięto zapis pozostaje zaznaczone do usunięcia w następnej operacji synchronizacji. Używam do tego celu Ext.data.Store.rejectChanges().

+0

To nie jest metoda domyślna? Czy użyłeś [tej implementacji] (http://www.sencha.com/forum/showthread.php?141982-commitChanges-and-rejectChanges-for-Store-in-ExtJS-4)? – VDP

+0

Ta metoda istnieje w ExtJS 4.1.1a. Nie jestem pewien co do wersji 4.0 lub wersji pośredniej.To powinna być poprawna odpowiedź. –

2

Używam funkcji zwrotnych "sukces", "niepowodzenie" lub "oddzwanianie" podczas synchronizacji. Mam nadzieję, że ta metoda może ci pomóc.

Powiązane problemy