2016-03-08 19 views
5

Kodum Bunu yaparsam, sorun değilng-table ile sunucu tarafı sayfalama nasıl yapabilirim?

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

olduğunu. Ama bunun sebebi, total kodlamasını kodladığım için açık bir anlam ifade etmiyor. Ben nedense o zaman ng-table yangınları http istek iki kez

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

yaparsanız. Peki bunu yapmanın doğru yolu nedir?

+0

Ne istediğinizi anlayabilseniz de, sorunuz benim için kafa karıştırıcıdır. –

+0

Hangi kısım - Açıklamaktan mutluluk duyuyor musunuz? – Shamoon

+0

Bunu [gerçek dünya örneğinde] yapmıyorlar mı (http://ng-table.com/#/intro/demo-real-world)? – klskl

cevap

1

ng-table komut dosyasının eski sürümlerinden birini kullandığınızı kabul ederek, ilk adım, verileri api hizmetinizden almak ve ardından istediğiniz ng-table parametrelerini şiddete bağlamaktır.

$http servisi ile isteği başarılı olduğunu ve bu hizmetin içine eğer ngTableParams başlatmak veriler sadece BİR SÜRE alacak. Böylece birden fazla geri aramada sorunlardan kaçınacaksınız. Not: getData'daki değişikliklere de dikkat ederek, siparişin ve filtrelenmenin sayfalandırma ile nasıl çözüldüğüne dikkat edin.

İşte projelerim için kullandığım çözüm, umarım yardımcı olur.

$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

Tabii ki, sunucu tarafında sayfalandırma olmak zorunda değilsiniz, ancak bu durumda genellikle doğru çalışan bir çözüm verdim. Ve bu benim cevabımı oylamak için bir sebep değil ... – arman1991

+0

Soru, sunucu tarafı sayfalandırma için özellikle sorar – curlyhairedgenius

0

aşağıdan sorununuzu çözecek, emin entierly değilim ama kodunun altına kullanırım ve çift çağrı konuyu

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

Not sebep değil onun: Yukarıda yapıştırılan kod direktifin parçası olan, $ zaman aşımı bölüm birden fazla çağrıdan kaçınmaktır (kısma) ve callback() gerçek $ http çağrı yapar.

buradan sizin için almak önemlidir parçası olabilir geçerli: $defer.resolve(data.PageData) senin durumunda olduğu gibi da hiçbir return ifadesi yoktur benim için hile yapıyor.

İlgili konular