2016-03-08 7 views
5

Mein Code istWie kann ich die serverseitige Paginierung mit ng-table durchführen?

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

Wenn ich das tue, es ist in Ordnung. Aber das liegt daran, dass ich die total fest codierte, was offensichtlich keinen Sinn ergibt. Wenn ich das tue

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

dann ng-table Brände die http Anfrage zweimal aus irgendeinem Grund. Also, was ist der richtige Weg?

+0

Obwohl es verstanden werden kann, was Sie wollen, ist Ihre Frage verwirrend für mich. –

+0

Welchen Teil - ich bin froh, zu klären? – Shamoon

+0

Tun sie das nicht in ihrem [realen Beispiel] (http://ng-table.com/#/intro/demo-real-world)? – klskl

Antwort

1

In der Annahme, dass Sie eine der älteren Versionen von ng-table Skript verwenden, ist der erste Schritt, die Daten von Ihrem API-Service zu erhalten, und dann die Parameter für ng-table, die Sie wollen, zu initialisieren.

Mit $http Service werden Sie die Daten nur EINmal erhalten, wenn die Anforderung erfolgreich ist, und innerhalb dieser Dienst initialisieren Ihre ngTableParams. So vermeiden Sie Probleme mit mehreren Rückrufen.

Beachten Sie auch die Änderungen in getData Teil, wie Bestellung und Filterung mit Seitenumbruch gelöst werden.

Hier ist die Lösung, die ich für meine Projekte verwendet habe, hoffe, es hilft.

$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

Natürlich muss es nicht Server Seitenumbruch sein, aber in dieser Situation gab ich allgemein Lösung, die richtig funktioniert. Und das ist kein Grund, meine Antwort abzustimmen ... – arman1991

+0

Die Frage bezieht sich speziell auf die serverseitige Paginierung – curlyhairedgenius

0

Ich bin nicht sicher, entierly wenn unten Ihr Problem lösen würde, aber ich Code unten verwenden und seine verursacht keine doppelten Anruf Ausgabe

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

Hinweis: Code eingefügt oben Teil einer Richtlinie ist, die $ timeout Teil ist es, mehrere Anrufe zu vermeiden (Drosselung) und callback() tut den tatsächlichen $ http Anruf.

Der wichtige Teil für Sie von hier aus zu nehmen ist, sein kann: $defer.resolve(data.PageData) für mich den Trick tun es auch keine return Aussage wie es in Ihrem Fall ist.

Verwandte Themen