2016-03-08 28 views
5

我的代碼是如何使用ng-table做服務器端分頁?

$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火災http要求的兩倍。那麼,正確的做法是什麼?

+0

雖然它可以理解你想要什麼,但你的問題讓我感到困惑。 –

+0

哪一部分 - 我很樂意澄清? – Shamoon

+0

他們是不是在他們的[真實世界的例子](http://ng-table.com/#/intro/demo-real-world)中這樣做? – klskl

回答

1

假設您使用的是舊版本的ng-table腳本之一,第一步是從您的api服務獲取數據,然後初始化您想要的ng-table的參數。

隨着$http服務,您將得到的數據只是ONE TIME如果請求成功,該服務裏面初始化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())); 
       } 
     }); 
}); 
+0

當然,它不一定是服務器端分頁,但在這種情況下,我給出了一般解決方案,正常工作。這不是一個理由來投票我的答案... – arman1991

+0

該問題特別要求服務器端分頁 – curlyhairedgenius

0

我不entierly知道下面會解決你的問題,但我不使用下面的代碼和它不會導致兩個人通話問題

   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); 
       } 

注:上面粘貼的代碼是一個指令的一部分,在$超時部分是爲了避免多次調用(節流),並且callback()執行實際的$ http調用。

從這裏爲你帶來的重要部分可能是:$defer.resolve(data.PageData)對我來說是訣竅 也沒有return這樣的陳述,就像你的情況一樣。