Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the dirty records from an ExtJS data store?

Tags:

extjs

extjs4

Other than iterating over the records in the store and checking the dirty flag, is there a cleaner way?

EDIT

I am using ExtJS4, btw.

Here is a snippet of the data returned. Notice there is a dirty: true with the modified object set (which is actually the OLD data and the data object contains the NEW data)

data: Ext.Class.Class.newClass
    items: Array[3]
        0: Ext.Class.Class.newClass
            data: Object
                incidentCount: 14
                incidentKey: "5466BD05-E4DD-4C1F-9F73-61ABAC6D3753"
            dirty: true
            id: "Ext.data.Store.ImplicitModel-TEDetailIncidencesStore-ext-record-13"
            index: 0
            internalId: "ext-record-13"
            modified: Object
                incidentCount: 7

Notice the data block contains an incidentCount of 14. That is the NEW value and the modified block contains the OLD value of 7.

EDIT 2

I load the store with:

TimeEntryDetailsStore.load({
     params:{
        timeEntryKey:"myKey"
     }
});

After this fires, the above store is successfully loaded with 3 rows. Then, when I change a value, the dirty flag is set and you get the above block of data

Thanks

EDIT 3

This is the code I am going to use unless someone has a better way. I don't understand why the getUpdatedRecords() returns an empty array. But oh well.

for(c=0; c < TEDetailIncidencesStore.count(); c++ ) {
    if( TEDetailIncidencesStore.data.items[c]["dirty"] == true) {
        var dirtyRecord = TEDetailIncidencesStore.data.items[c];
        updateTEDetailIncidences(dirtyRecord);
    }
}
like image 894
cbmeeks Avatar asked Jun 09 '11 14:06

cbmeeks


2 Answers

The trick is that the store reader needs to designate a idProperty or all rows are considered new. Here's the construct that is working for me:

Ext.define('Sites', {
    extend: 'Ext.data.Model',
    fields: [
    {name: 'inCphr', type: 'boolean'},
    {name: 'department', type: 'string'},
    {name: 'commune', type: 'string'},
    {name: 'clinic', type: 'string'},
    {name: 'sitecode', type: 'int'},
    {name: 'dbsite', type: 'int'},
    {name: 'ipAddress', type: 'string'},
    {name: 'network', type: 'string'},
    {name: 'lastChanged', type: 'date'}
    ]
}); 
var store = Ext.create('Ext.data.Store', {
    model: 'Sites',
    proxy: {
        type: 'ajax',
        url : 'getHaitiSites.php?task=get',
        reader:{ 
            type:'json',
            root: 'results',
            idProperty: 'sitecode'
        }
    }
});

If you can get a grid to show 'dirty' elements, then store.getUpdatedRecords().length will be > 0. I saw one comment that suggested this would only work with a json reader, but I don't see why it wouldn't work for other data structures as well.

like image 199
shw Avatar answered Sep 21 '22 01:09

shw


store.getUpdatedRecords() in ExtJs 4 or store.getModifiedRecords() in ExtJs3

like image 27
shane87 Avatar answered Sep 23 '22 01:09

shane87