Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to configure ExtJS 4 Store (proxy and reader) to read metadata

My question is how to get metadata besides totalRecords, in my case it is version, code, searchquery (please look at json).

{
"result": {
    "version":"1",
    "code":"200",
    "searchquery": "false",
    "totalRecords": "2",
    "account":[
            {
                "lastname": "Ivanoff", 
                "firstname": "Ivan", 
                "accountId":"1"
            },
            {
                "lastname": "Smirnoff", 
                "firstname": "Ivan", 
                "accountId":"2"
            }
        ]
}

}

Here is my model:

Ext.define("test.Account", {
    extend: "Ext.data.Model",
    fields: [
        {name: 'accountId', type: 'string'},
        {name: 'lastname', type: 'string'},
        {name: 'firstname', type: 'string'}    
    ]
});

And store:

Ext.define("test.TestStore", {
    extend: "Ext.data.Store",
    model: "test.Account",
    proxy: {
        type: "ajax",
        url: "users.json",  
        reader: {
            type    : 'json',
            root    : 'result.account',
            totalProperty: "result.totalRecords"
        }
    },

    listeners: {
        load: function(store, records, success) {
            console.log("Load: success " + success);     
        }
    }
});

Using this store I am able to load records (account) and cannot find any methods to access rest of the fields.

Thank you in advance.

like image 827
barmaleikin Avatar asked Jun 12 '12 16:06

barmaleikin


3 Answers

Here is solution for my problem. I am handling afterRequest event in the Proxy class where I can get response data, parse it and save metadata. This is proxy part of the TestStore class:

So here is proxy part from the TestStore class:

proxy: {
        type: "ajax",
        url: "/users.json",  
        reader: {
            type    : 'json',
            root    : 'gip.account',
            totalProperty: "gip.totalRecords",
            searchquery: "searchquery"
        },
        afterRequest: function(req, res) {
            console.log("Ahoy!", req.operation.response);    
        }
    }
like image 189
barmaleikin Avatar answered Nov 16 '22 04:11

barmaleikin


It is possible to use the 'metachange' event of the store.

All the non-extjs specific information can be grouped in JSON in the separate object:

{
    "result": {
        "totalRecords": "2",
        "account":[
            {
                "lastname": "Ivanoff", 
                "firstname": "Ivan", 
                "accountId":"1"
            },
            {
                "lastname": "Smirnoff", 
                "firstname": "Ivan", 
                "accountId":"2"
            }
        ]
    },
    "myMetaData": {
        "version":"1",
        "code":"200",
        "searchquery": "false"
    }
}

The store is configured as

Ext.define("test.TestStore", {
    extend: "Ext.data.Store",
    model: "test.Account",
    proxy: {
        type: "ajax",
        url: "users.json",  
        reader: {
            type    : 'json',
            root    : 'result.account',
            totalProperty: "result.totalRecords",
            metaProperty: 'myMetaData'
        }
    },

    listeners: {
        metachange: function(store, meta) {
            console.log("Version " + meta.version + "Search query " + meta.searchQuery);     
        }
    }
});
like image 32
Ivan Prasol Avatar answered Nov 16 '22 02:11

Ivan Prasol


Take a look at Ext.data.Proxy class and more specifically processResponse() method. If you need to extract any additional data - you will have to extend standard class and change that method.

like image 25
sha Avatar answered Nov 16 '22 03:11

sha