AngularJS: Can I use a filter to chunk an array in ng-repeat?

前端 未结 3 1222
失恋的感觉
失恋的感觉 2021-01-21 01:14

Edit to add a clear question: I have a flat array of some length and I want to put it into a tr/td type view? This might also be in a bootstrap grid or somethin

3条回答
  •  半阙折子戏
    2021-01-21 01:48

    You can avoid an infinite digest loop by simply memoizing your chunk function. This solves the issue of ng-repeat never finding the proper references and always thinking you are returning new items causing the infinite $digest.

    angular.module('filters', []).
      filter('chunk', function () {
    ​
        function cacheIt(func) {
          var cache = {};
          return function(arg, chunk_size) {
            // if the function has been called with the argument
            // short circuit and use cached value, otherwise call the
            // cached function with the argument and save it to the cache as well then return
            return cache[arg] ? cache[arg] : cache[arg] = func(arg,chunk_size);
          };
        }
        
        // unchanged from your example apart from we are no longer directly returning this   ​
        function chunk(items, chunk_size) {
          var chunks = [];
          if (angular.isArray(items)) {
            if (isNaN(chunk_size))
              chunk_size = 4;
            for (var i = 0; i < items.length; i += chunk_size) {
              chunks.push(items.slice(i, i + chunk_size));
            }
          } else {
            console.log("items is not an array: " + angular.toJson(items));
          }
          return chunks;
        }
    ​    // now we return the cached or memoized version of our chunk function
        // if you want to use lodash this is really easy since there is already a chunk and memoize function all above code would be removed
        // this return would simply be: return _.memoize(_.chunk);
    
        return cacheIt(chunk);
      });
    

提交回复
热议问题