Angularjs分页限制数据加载

时间:2014-02-21 20:29:53

标签: angularjs laravel

我总是用角度

来管理分页

从服务器检索所有数据

并缓存客户端(简单地将其放入服务中)

现在我必须处理大量数据

即10000/100000。

我想知道是否会遇到麻烦

使用相同的方法。

Imo将参数传递给服务器,如

页面搜索它对于一个好的

非常烦人

用户体验。

更新(针对评论中的点)

这是一种可能的方式 可以从服务器获取

如果用户离得太近,

一次就像1000个项目

到偏移量(即它在800个项目上)

从服务器检索接下来的1000个项目

合并缓存等等

甚至ng-grid管理分页也很奇怪 将参数发送到服务器

更新

我最终喜欢:

(function(window, angular, undefined) {
    'use strict';
    angular.module('my.modal.stream',[])
        .provider('Stream', function() {
            var apiBaseUrl = null;
            this.setBaseUrl = function(url) {
                apiBaseUrl = url;
            };
            this.$get = function($http,$q) {
                return {
                    get: function(id) {
                        if(apiBaseUrl===null){
                            throw new Error('You should set a base api url');
                        }
                        if(typeof id !== 'number'){
                            throw new Error('Only integer is allowed');
                        }
                        if(id < 1){
                            throw new Error('Only integer greater than 1 is allowed');
                        }
                        var url = apiBaseUrl + '/' + id;
                        var deferred = $q.defer();
                        $http.get(url)
                            .success(function (response) {
                                deferred.resolve(response);
                            })
                            .error(function(data, status, headers, config) {
                                deferred.reject([]);
                            });
                        return deferred.promise; 
                    }
                };
            };
    });
})(window, angular);
(function(window, angular, undefined) {
    'use strict';
    angular.module('my.mod.pagination',['my.mod.stream'])
        .factory('Paginator', function(Stream) {
            return function(pageSize) {
                    var cache =[];
                    var staticCache =[];
                    var hasNext = false;
                    var currentOffset= 0;
                    var numOfItemsXpage = pageSize;
                    var numOfItems = 0;
                    var totPages = 0;
                    var currentPage = 1;
                    var end = 0;
                    var start = 0;
                    var chunk = 0;
                    var currentChunk = 1;
                    var offSetLimit = 0;
                    var load = function() {
                        Stream.get(currentChunk).then(function(response){
                            staticCache = _.union(staticCache,response.data);
                            cache = _.union(cache,response.data);
                            chunk = response.chunk;
                            loadFromCache();
                        });
                    };
                    var loadFromCache= function() {
                        numOfItems = cache.length;
                        offSetLimit = (currentPage*numOfItemsXpage)+numOfItemsXpage;
                        if(offSetLimit  > numOfItems){
                            currentChunk++;
                            load();

                        }
                        hasNext = numOfItems > numOfItemsXpage;
                        totPages = Math.ceil(numOfItems/numOfItemsXpage);
                        paginator.items = cache.slice(currentOffset, numOfItemsXpage*currentPage);
                        start = totPages + 1;
                        end = totPages+1;
                        hasNext = numOfItems > (currentPage * numOfItemsXpage);
                    };
                    var paginator = {
                        items : [],
                        notFilterLabel: '',
                        hasNext: function() {
                            return hasNext;
                        },
                        hasPrevious: function() {
                            return currentOffset !== 0;
                        },
                        hasFirst: function() {
                           return currentPage !== 1; 
                        },
                        hasLast: function() {
                           return totPages > 2 && currentPage!==totPages; 
                        },
                        next: function() {
                            if (this.hasNext()) {
                                currentPage++;
                                currentOffset += numOfItemsXpage;
                                loadFromCache();
                            }
                        },
                        previous: function() {
                            if(this.hasPrevious()) {
                                currentPage--;
                                currentOffset -= numOfItemsXpage;
                                loadFromCache();
                            }
                        },
                        toPageId:function(num){
                            currentPage=num;
                            currentOffset= (num-1) * numOfItemsXpage;
                            loadFromCache();
                        },
                        first:function(){
                            this.toPageId(1);
                        },
                        last:function(){
                            this.toPageId(totPages);
                        },
                        getNumOfItems : function(){
                            return numOfItems;
                        },
                        getCurrentPage: function() {
                            return currentPage;
                        },
                        getEnd: function() {
                            return end;
                        },
                        getStart: function() {
                            return start;
                        },
                        getTotPages: function() {
                            return totPages;
                        },
                        getNumOfItemsXpage:function(){
                            return numOfItemsXpage;
                        },
                        search:function(str){
                            if(str===this.notFilterLabel){
                                if(angular.equals(staticCache, cache)){
                                    return;
                                }
                                cache = staticCache;
                            }
                            else{
                                cache = staticCache;
                                cache = _.filter(cache, function(item){ return item.type == str; });
                            }
                            currentPage = 1;
                            currentOffset= 0;
                            loadFromCache();
                        }
                    };
                    load();
                    return paginator;
                 }
            });

})(window, angular);  

服务器端与laravel(所有项目都被缓存)

public function tag($page)
    {

        $service = new ApiTagService(new ApiTagModel());
        $items = $service->all();
        $numOfItems = count($items);
        if($numOfItems > 0){
            $length = self::CHUNK;
            if($length > $numOfItems){
                $length = $numOfItems;
            }
            $numOfPages = ceil($numOfItems/$length);
            if($page > $numOfPages){
                $page = $numOfPages; 
            }
            $offSet = ($page - 1) * $length;
            $chunk = array_slice($items, $offSet, $length);
            return Response::json(array(
                    'status'=>200,
                    'pages'=>$numOfPages,
                    'chunk'=>$length,
                    'data'=> $chunk
                ),200);
        }
        return Response::json(array(
                    'status'=>200,
                    'data'=> array()
                ),200);
    }   

现在唯一的麻烦就是管理过滤器 我不知道如何对待过滤:(

0 个答案:

没有答案