2011-12-22 8 views
5

Mam panel siatki, który po opuszczeniu strony, chcę sprawdzić, czy jakieś elementy w sklepie (lub iteracji poprzez modele/rekordy), aby sprawdzić, czy są jakieś niezapisane zmiany/dodatki.Sprawdź, czy sklep (lub nagrania) zostały poddane edycji?

Początkowo próbowałem użyć panel.getStore().getNewRecords() dla nowych rekordów, ale zwraca wszystkie aktualnie odsyłane rekordy. panel.getStore().getUpdatedRecords() wydaje się ignorować rekordy, pomimo linii w siatce mającej mały czerwony trójkąt w każdej komórce.

Czy ktoś może doradzić w sprawie prawidłowego sposobu sprawdzenia, czy w sklepie znajdują się nowe lub zaktualizowane wpisy?

Odpowiedz

16

To może pracować dla ciebie.

var records = store.getRange(); 

for (var i = 0; i < records.length; i++) { 
    var rec = records[i]; 

    if (rec.dirty == true) { 
     //Save data 
    } 
} 
1

Używam tego:

isStoreModified: function(store) 
{ 
    var modifiedRecords = store.getModifiedRecords(); 
    return modifiedRecords && modifiedRecords.length && modifiedRecords.length > 0; 
}, 
+0

TypeError: Object [object Object] nie ma metody 'getModifiedRecords' –

+0

Jakiej wersji Ext Js używasz? Funkcja znajduje się w magazynie AbstractStore i sprawdziłem ją dwukrotnie, przeszukując kod źródłowy Ext JS 4.1.3 i 4.2.1. Zobacz: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.AbstractStore-method-getModifiedRecords – costa

0

Oparłem się to odpowiedź przez @theboulderer. Wiem, że to stary wątek, ale pomyślałem, że może być przydatny dla innych, którzy znajdą tę stronę.

Używam modelu MVC, więc miej to na uwadze.

Wszystko, co musisz zrobić, to przekazać magazyn do funkcji i zwraca wartość boolowską.

Zastosowanie:

if (this.isDirtyStore(myStore)){ 
    ... 
} 

Funkcja:

isDirtyStore: function(theStore){ 
    var isDirty = false; 

    theStore.each(function(item){ 
     if(item.dirty == true){ 
      isDirty = true; 
     } 
    }); 
    if (!isDirty){ 
     isDirty = (theStore.removed.length > 0); 
    } 
    return isDirty; 
} 
4

Można użyć coś takiego:

if (.. Panel.getStore() getModifiedRecords() length> 0) { console.log ("sklep ma brudne rekordy"); }

+1

Nie uwzględnia usuniętych rekordów ... – HDave

10

Aby zachować zamkniętą logikę "brudnej kontroli", zdecydowałem się dodać metodę isDirty() do obiektu Ext.data.Store. Użyłem tej samej logiki, której używa AbstractStore.sync() do określenia, czy sklep musi zsynchronizować.

Ext.define(null, { 
    override: "Ext.data.Store", 
    isDirty: function() { 
     return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0); 
    } 
}); 

Używam ExtJS 4.2.1. Jeśli wszystkie twoje rekordy zostaną zwrócone, gdy zadzwonisz pod numer getNewRecords(), powinieneś sprawdzić, czy ustawiłeś dla swojego modelu wartość dla idProperty.

+0

Brilliant ... perfect . – HDave

1
if (panel.getStore().needsSync) { 
    //store have unsaved changes. 
} 
0

Jeśli jesteś nowy nadrzędne tutaj jest @jstrickers odpowiedź na mvc programu styl:

utworzyć:

Ext.define('YourFolder.overridefolder.DataStore', { 

    override: "Ext.data.Store", 
    isDirty: function() { 
     return (this.getNewRecords().length > 0 || this.getUpdatedRecords().length > 0 || this.getRemovedRecords().length > 0); 
    } 

}); 

Dodaj ten plik do odpowiedniego folderu i wskaż mu w app.js ' wymagane ", wtedy isDirty będzie dostępne w twoim ext.data.store

Działa świetnie, a funkcja będzie dostępna, gdy jej potrzebujesz.

Powiązane problemy