Use two store with common model.
The first one is the current one (with buffering, paging, etc.). The second one is a normal store, without buffering, paging, etc. When you click on 'Read all' just load every records into the second store and update the first one with the new data.
Here's an example:
Ext.create ('Ext.grid.Panel', {
renderTo: Ext.getBody () ,
width: 300 ,
height: 300 ,
store: bufferingStore ,
columns: [ ... ] ,
tbar: {
items: [{
xtype: 'button' ,
text: 'Read all' ,
handler: function (btn) {
// Here's the call to retrieve all records
// Also you can do it with 'autoLoad: true' param
normalStore.load ();
// Then, flush the bufferingStore, currently use by the grid
bufferingStore.removeAll ();
// Populate bufferingStore with normalStore
normalStore.each (function (record) {
bufferingStore.add (record);
});
}
}]
}
});
normalStore and bufferingStore have the same model but normalStore will have a different source to retrieve each record.