Search code examples
extjsextjs4

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


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

Solution

  • 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.