如何使用ng-table进行服务器端分页?

时间:2016-03-08 14:18:01

标签: javascript angularjs pagination ngtable

我的代码是

ORDER BY LastPacketTime DESC, TrackID DESC

如果我这样做,那很好。但那是因为我对$scope.loadQuestions = function() { $scope.questionCount = 0; $scope.questionTable = new NgTableParams({ count: [] }, { total: 19387, getData: function($defer, params) { $scope.filter.sort = params.orderBy(); $scope.filter.page = params.page(); return $http.get("/api/questions", { params: $scope.filter }).then(function(response) { $scope.questionCount = response.data.count; return response.data.questions; }); } }); }; 进行了硬编码,这显然没有意义。如果我做

total

然后由于某种原因 return $http.get("/api/questions", { params: $scope.filter }).then(function(response) { params.total(response.data.count); $scope.questionCount = response.data.count; return response.data.questions; }); 两次触发ng-table请求。那么正确的做法是什么?

2 个答案:

答案 0 :(得分:0)

我不确定下面是否可以解决您的问题,但我确实使用下面的代码并且它不会导致双重调用问题

                getData: function ($defer, params) {
                    if (timeout) $timeout.cancel(timeout);
                    timeout = $timeout(function () {
                        callback().then(function (data) {
                            params.total(data.TotalCount);
                            $defer.resolve(data.PageData);
                        });
                    }, 700);
                }

注意:上面粘贴的代码是指令的一部分,$ timeout部分是为了避免多次调用(限制)而callback()执行实际的$ http调用。

从这里开始的重要部分可能是:$defer.resolve(data.PageData)正在为我做这个伎俩 还有没有return声明,就像你的情况一样。

答案 1 :(得分:0)

假设您使用的是ng-table脚本的旧版本之一,第一步是从您的api服务获取数据,然后初始化您想要的ng-table参数

使用$http服务,如果请求成功,您将只获得一次数据,并在该服务内部初始化您的 ngTableParams 。因此,您将避免多次回调的问题。

另请注意 getData 部分中的更改如何通过分页解决排序和过滤。

以下是我用于项目的解决方案,希望它有所帮助。

$http.get('/api/questions').success(function (data) {
                $scope.questionTable = new ngTableParams({
                    page: 1,
                    count: 10
                },
                {
                  total: data.length,
                  getData: function ($defer, params) {
                    var filteredData = params.filter() ? $filter('filter')(data, params.filter()) : data;
                    var orderedData = params.sorting() ? $filter('orderBy')(filteredData, params.orderBy()) : data;
                    params.total(orderedData.length);
                    $defer.resolve(orderedData.slice((params.page() - 1) * params.count(), params.page() * params.count()));
                }
        });
});