-
8 Jan 2013 9:41 AM #1
Buffered store.findExact() throw Object [object Object] has no method 'findIndexBy'
Buffered store.findExact() throw Object [object Object] has no method 'findIndexBy'
Hi again!
I found that method store.findExact() call store.data.findIndexBy();
For most stores store.data property is Ext.util.MixedCollection which has findIndexBy() method.
But if store.buffered data property is PageMap (extend: 'Ext.util.LruCache', 'Ext.util.HashMap'). All this classes has no findIndexBy method =(
Code:if (me.buffered) { me.data = new me.PageMap({ store: me, pageSize: me.pageSize, maxSize: me.purgePageCount, listeners: { // Whenever PageMap gets cleared, it means we re no longer interested in // any outstanding page prefetches, so cancel tham all clear: me.onPageMapClear, scope: me } }); me.pageRequests = {}; me.sortOnLoad = false; me.filterOnLoad = false; } else { me.data = new Ext.util.MixedCollection(false, Ext.data.Store.recordIdFn); me.data.pageSize = me.pageSize; }
-
9 Jan 2013 3:26 PM #2
How do you initiate this search? Since a buffered store is designed to be a partial view of the remote data, at best, only some records will be local and hence findable.
I recall that we did merge a fix (it may be new to 4.2.0 beta 2 - http://www.sencha.com/forum/showthre...-Now-Available) that should allow you to find records that are "in view" under the assumption that this is often initiated by a row action or similar and the record is certain to be local.
Beyond that special case, all other operations that would require complete knowledge will probably fail in this way as there is no point in implementing methods that cannot possibly work with partial data.Don Griffin
Ext JS Development Team Lead
Check the docs. Learn how to (properly) report a framework issue and a Sencha Cmd issue
"Use the source, Luke!"
-
19 Mar 2013 1:32 PM #3
This is not fixed in the 4.2.0 release. As long as store is buffered, both find and query fail.
-
19 Mar 2013 10:14 PM #4
We have a "fix" for this ready to go.
But you do understand the limitation don't you?
You will only get to search the few patches of the dataset that you have visited.Search the forum: http://www.google.com/coop/cse?cx=01...%3Az7of1ufqccu
Read the docs too: http://extjs.com/deploy/dev/docs/
Scope: http://extjs.com/forum/showthread.ph...642#post257642
-
21 Mar 2013 8:45 AM #5
Thanks for the reply. Yes I do understand the limitation. In our app, we make sure the record we want find is fetched from the server side in a buffered store. So what is the fix? or when it will be available?
-
21 Mar 2013 10:02 AM #6
If that is the case, why is the store buffered then? Just want to understand the use case here
Don Griffin
Ext JS Development Team Lead
Check the docs. Learn how to (properly) report a framework issue and a Sencha Cmd issue
"Use the source, Luke!"
-
26 Mar 2013 10:37 AM #7
-
26 Mar 2013 11:08 AM #8
If the number of records is very large, then a buffered store is definitely the way to go - but in that case the store does not have the records so it cannot find them by id at least without your ensuring that the appropriate pages are fetched. Given an id though the store cannot know what pages that will be.
Is there some why you solve that in your application?Don Griffin
Ext JS Development Team Lead
Check the docs. Learn how to (properly) report a framework issue and a Sencha Cmd issue
"Use the source, Luke!"
-
26 Mar 2013 1:55 PM #9
-
27 Mar 2013 1:37 AM #10
Try this override
Code:Ext.override(Ext.data.Store.prototype.PageMap, { forEach: function(fn, scope) { var me = this, pageNumbers = Ext.Object.getKeys(me.map), pageCount = pageNumbers.length, i, j, pageNumber, page, pageSize; for (i = 0; i < pageCount; i++) { pageNumbers[i] = Number(pageNumbers[i]); } Ext.Array.sort(pageNumbers); scope = scope || me; for (i = 0; i < pageCount; i++) { pageNumber = pageNumbers[i]; page = me.getPage(pageNumber); pageSize = page.length; for (j = 0; j < pageSize; j++) { if (fn.call(scope, page[j], (pageNumber - 1) * me.pageSize + j) === false) { return; } } } }, /** * Returns the first record in this page map which elicits a true return value from the * passed selection function. * * *IMPORTANT * This can ONLY find records which happen to be cached in the page cache. This will be parts of the dataset around the currently * visible zone, or recently visited zones if the pages have not yet been purged from the cache. * * This CAN NOT find records which have not been loaded into the cache.* * * If full client side searching is required, do not use a buffered store, instead use a regular, fully loaded store and * use the {@link Ext.grid.plugin.BufferedRenderer BufferedRenderer} plugin to minimize DOM footprint. * @param {Function} fn The selection function to execute for each item. * @param {Mixed} fn.rec The record. * @param {Mixed} fn.index The index in the total dataset of the record. * @param {Object} [scope] The scope (`this` reference) in which the function is executed. Defaults to this PageMap. * @return {Object} The first record in this page map which returned true from the selection * function, or null if none was found. */ findBy: function(fn, scope) { var me = this, result = null; scope = scope || me; me.forEach(function(rec, index) { if (fn.call(scope, rec, index)) { result = rec; return false; } }); return result; }, /** * Returns the index *in the whole dataset* of the first record in this page map which elicits a true return value from the * passed selection function. * * *IMPORTANT * This can ONLY find records which happen to be cached in the page cache. This will be parts of the dataset around the currently * visible zone, or recently visited zones if the pages have not yet been purged from the cache. * * This CAN NOT find records which have not been loaded into the cache.* * * If full client side searching is required, do not use a buffered store, instead use a regular, fully loaded store and * use the {@link Ext.grid.plugin.BufferedRenderer BufferedRenderer} plugin to minimize DOM footprint. * @param {Function} fn The selection function to execute for each item. * @param {Mixed} fn.rec The record. * @param {Mixed} fn.index The index in the total dataset of the record. * @param {Object} [scope] The scope (`this` reference) in which the function is executed. Defaults to this PageMap. * @return {Number} The index first record in this page map which returned true from the selection * function, or -1 if none was found. */ findIndexBy: function(fn, scope) { var me = this, result = -1; scope = scope || me; me.forEach(function(rec, index) { if (fn.call(scope, rec)) { result = index; return false; } }); return result; } });Search the forum: http://www.google.com/coop/cse?cx=01...%3Az7of1ufqccu
Read the docs too: http://extjs.com/deploy/dev/docs/
Scope: http://extjs.com/forum/showthread.ph...642#post257642


Reply With Quote