2011-12-22 19 views
5

Ho un pannello della griglia, che quando esco dalla pagina, voglio un controllo per vedere se alcuni articoli nel negozio (o scorrere tra modelli/record) per verificare se ci sono modifiche/aggiunte non salvate.Controllare se un negozio (o record) sono stati modificati?

ho inizialmente provato usando panel.getStore().getNewRecords() per nuovi record, ma restituisce ogni record attualmente spostate dentro. panel.getStore().getUpdatedRecords() sembra ignorare record, nonostante le linee della griglia con il piccolo triangolo rosso in ogni cella.

Quindi qualcuno può consigliare sul modo corretto per verificare se esistono nuovi record aggiornati o aggiornati in un negozio?

risposta

16

Questo potrebbe funzionare per voi.

var records = store.getRange(); 

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

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

Io uso questo:

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

TypeError: Object [object Object] non ha un metodo '' getModifiedRecords –

+0

Quale versione di Ext JS si usa? La funzione è in AbstractStore e ho ricontrollato cercando il codice sorgente Ext Js 4.1.3 e 4.2.1. Vedere questo: http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.data.AbstractStore-method-getModifiedRecords – costa

0

ho basato questo fuori la risposta @theboulderer. So che questo è un thread vecchio, ma ho pensato che potrebbe essere utile per gli altri che trovano questa pagina.

Sto utilizzando il modello MVC, quindi tienilo a mente.

Tutto ciò che dovete fare è passare il negozio alla funzione e restituisce un valore booleano.

Usage:

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

Funzione:

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

si può usare qualcosa di simile:

se (.. Panel.getStore() getModifiedRecords() Lunghezza> 0) { console.log ('store has dirty records'); }

+1

Non tenere conto di record rimossi ... – HDave

10

Per mantenere incapsulata la logica di controllo sporco, ho scelto di aggiungere un metodo isDirty() all'oggetto Ext.data.Store. Ho utilizzato la stessa logica utilizzata da AbstractStore.sync() per determinare se è necessario sincronizzare lo store.

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

Sto usando ExtJS 4.2.1. Se tutti i record vengono restituiti quando si chiama getNewRecords(), è necessario verificare di aver impostato un valore per idProperty sul modello.

+0

brillante ... perfetto . – HDave

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

Se siete nuovi a override qui è @jstrickers risposta per un programma MVC stile:

Crea:

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

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

}); 

Aggiungere questo file nella cartella e punto opportuno in app.js ' necessaria', allora l'IsDirty sarà disponibile nel vostro ext.data.store

Funziona alla grande e la funzione sarà disponibile erano ne avete bisogno.

Problemi correlati