-
30 Aug 2012 9:58 AM #1
Answered: Refresh RowNumberer after store.insert() ?
Answered: Refresh RowNumberer after store.insert() ?
After a store.insert(0, record), I end up like this:
1 data1 data2
1 data1 data2
2 data1 data2
3 data1 data2
4 data1 data2
etc.
How can I get the rownumberer to reset after the insert?
-
Best Answer Posted by scottmartin
If you look at how it works, you will see that RowNumberer :: renderer uses
record.indexOfTotal(Record)
When you insert the record, there is no record.index value, .. so it returns 0 twice, hence you see 1, 1, 2, 3, 4.
You could override record.indexOfTotal() to fix thjis.
Scott.Code:Ext.override(Ext.grid.RowNumberer, { renderer: function(value, metaData, record, rowIdx, colIdx, store) { var rowspan = this.rowspan; if (rowspan){ metaData.tdAttr = 'rowspan="' + rowspan + '"'; } metaData.tdCls = Ext.baseCSSPrefix + 'grid-cell-special'; console.log(store.indexOfTotal(record)); console.log(store.getTotalCount()); console.log(store.data.items.length); console.log(record); console.log('**'); return store.indexOfTotal(record) + 1; } }); var store = Ext.create('Ext.data.Store', { storeId : 'simpsonsStore', fields : ['name', 'email', 'change'], data : {'items' : [ { 'name' : 'Lisa', 'email' : 'lisa@simpsons.com', 'change' : 100 }, { 'name' : 'Bart', 'email' : 'bart@simpsons.com', 'change' : -20 }, { 'name' : 'Homer', 'email' : 'home@simpsons.com', 'change' : 23 }, { 'name' : 'Marge', 'email' : 'marge@simpsons.com', 'change' : -11 } ]}, proxy : { type : 'memory', reader : { type : 'json', root : 'items' } } }); var grid = Ext.create('Ext.grid.Panel', { title : 'Simpsons', store : Ext.data.StoreManager.lookup('simpsonsStore'), columns : [ { xtype: 'rownumberer' }, { header : 'Name', dataIndex : 'name' }, { header : 'Email', dataIndex : 'email', flex : 1 }, { header : 'Change', dataIndex : 'change' } ], height : 200, width : 400, renderTo : Ext.getBody() }); myrec = { name: 'new name'}; store.insert(0,myrec); console.log('-----------------------'); console.log(store.data.items.length);
-
30 Aug 2012 11:10 AM #2
Try call
after insert.Code:grid.getView().refresh();
-
30 Aug 2012 12:07 PM #3
First thing I tried

Have done after insert call, inside an add listener on the store, and manually refreshing from console.
-
30 Aug 2012 2:09 PM #4Sencha - Support Team
- Join Date
- Jul 2010
- Location
- Houston, Tx
- Posts
- 7,185
- Vote Rating
- 194
- Answers
- 433
If you look at how it works, you will see that RowNumberer :: renderer uses
record.indexOfTotal(Record)
When you insert the record, there is no record.index value, .. so it returns 0 twice, hence you see 1, 1, 2, 3, 4.
You could override record.indexOfTotal() to fix thjis.
Scott.Code:Ext.override(Ext.grid.RowNumberer, { renderer: function(value, metaData, record, rowIdx, colIdx, store) { var rowspan = this.rowspan; if (rowspan){ metaData.tdAttr = 'rowspan="' + rowspan + '"'; } metaData.tdCls = Ext.baseCSSPrefix + 'grid-cell-special'; console.log(store.indexOfTotal(record)); console.log(store.getTotalCount()); console.log(store.data.items.length); console.log(record); console.log('**'); return store.indexOfTotal(record) + 1; } }); var store = Ext.create('Ext.data.Store', { storeId : 'simpsonsStore', fields : ['name', 'email', 'change'], data : {'items' : [ { 'name' : 'Lisa', 'email' : 'lisa@simpsons.com', 'change' : 100 }, { 'name' : 'Bart', 'email' : 'bart@simpsons.com', 'change' : -20 }, { 'name' : 'Homer', 'email' : 'home@simpsons.com', 'change' : 23 }, { 'name' : 'Marge', 'email' : 'marge@simpsons.com', 'change' : -11 } ]}, proxy : { type : 'memory', reader : { type : 'json', root : 'items' } } }); var grid = Ext.create('Ext.grid.Panel', { title : 'Simpsons', store : Ext.data.StoreManager.lookup('simpsonsStore'), columns : [ { xtype: 'rownumberer' }, { header : 'Name', dataIndex : 'name' }, { header : 'Email', dataIndex : 'email', flex : 1 }, { header : 'Change', dataIndex : 'change' } ], height : 200, width : 400, renderTo : Ext.getBody() }); myrec = { name: 'new name'}; store.insert(0,myrec); console.log('-----------------------'); console.log(store.data.items.length);
-
31 Aug 2012 12:47 PM #5
Thanks Scott!
That helped point me in the right direction!
I add:
before the regular return in the override.Code:if(record.phantom) { return '*'; }
-
29 Jan 2013 9:08 PM #6
Scott,
Can we expect that the renderer's store.indexOfTotal() gets replaced with store.indexOf() sometimes soon?
Rownumberer is anyway not a key, so I guess this would be the more natural behaviour.
Just trying to avoid overrides for later maintenance...
Thanks


Reply With Quote