I created a service that abstracts the "caching" that stabilizes the filter. I really prefer it over transforming data in the controller. I'm now using it for my partition filter and for a Fisher-Yates shuffle filter.
Here's the link: https://github.com/m59peacemaker/Angular.FilterStabilize On Friday, April 25, 2014 10:10:56 PM UTC-5, Johnny Hauser wrote: > > I've got this filter for breaking up an array into smaller arrays based on > the "size" argument. Here's a jsbin of the non-working version: > http://jsbin.com/UmOMAgA/80/edit > Check out some previous revisions (a lot of people have toyed around with > it) for the working version using a cache. > > app.filter('partition', function() { > return function(arr, size) { > var newArr = []; > > for (var i=0; i<arr.length; i+=size) { > newArr.push(arr.slice(i, i+size)); > } > > return newArr; > }; > }); > > This causes an infinite digest. I think that's because of the new nested > arrays. The only solution I've found is to do some awkward caching with > JSON strings: > > app.filter('partition', function($cacheFactory) { > var arrayCache = $cacheFactory('partition'); > var filter = function(arr, size) { > if (!arr) { return; } > var newArr = []; > for (var i=0; i<arr.length; i+=size) { > newArr.push(arr.slice(i, i+size)); > } > var cachedParts; > var arrString = JSON.stringify(arr); > cachedParts = arrayCache.get(arrString+size); > if (JSON.stringify(cachedParts) === JSON.stringify(newArr)) { > return cachedParts; > } > arrayCache.put(arrString+size, newArr); > return newArr; > }; > return filter; > }); > > There's got to be a better way, right!? > -- You received this message because you are subscribed to the Google Groups "AngularJS" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/angular. For more options, visit https://groups.google.com/d/optout.
