2014-03-24 2 views
5

Derzeit verwende ich ng-grid, um Daten in einer Tabellenform anzuzeigen. Für einige Tabellen, die ziemlich viele Datensätze enthalten, verwende ich serverseitiges Paging, um die Daten abzurufen.Wie unendliches Scrollen mit ng-Gitter zu implementieren

Ich bin nicht sehr zufrieden mit dieser Lösung. Ich möchte mehr Daten holen, wenn die Bildlaufleiste das Ende des Fensters erreicht (etwas wie die ngInfiniteScroll Direktive). Ich habe keine Möglichkeit gefunden, dies mit ng-Grid zu tun.

Also meine Frage ist: Kann dies mit ng-grid getan werden, und wenn ja - wie? Für dieses Problem scheint es in ng-grid keine Out-of-the-Box-Lösung zu geben.

+1

Graben ng-Gitter und integrieren ngInfiniteScroll in Ihrem eigenen Tisch? –

+0

@ Eliran Malka. Das Integrieren von ngInfiniteScroll in meine eigene Tabelle wäre sicherlich ein Weg zu gehen. Aber warum alle Funktionen von ng-grid verlieren? – zszep

+1

Tabellen in Angular sind super einfach auch ohne ng-Gitter (vielleicht einfacher meiner Meinung nach). Ich glaube nicht, dass du viel verlierst, indem du ng-grid weglegst, besonders wenn du auch die Paginierung vernachlässigst. –

Antwort

15

Wenn der Benutzer zum Ende des Rasters geblättert hat, wird dieses Ereignis ausgelöst. nützlich für unendliches/serverseitiges Scrollen.

Beispiel:

scope.$on('ngGridEventScroll', function() { 
    //append rows to grid 
}); 

Verwendung dieses Ereignis informiert werden, wenn der Benutzer auf den Boden des Gitters verschoben, so dass Sie mehrere Zeilen an das Netz anhängen können.

Ressource:https://github.com/angular-ui/ng-grid/wiki/Grid-Events

+2

oh wow, ich habe Sachen mit der Idee über das Dekorieren überkompliziert. Das ist viel einfacher und eleganter. –

+0

Nun, ich habe die gesamte ng-Grid-API-Dokumentation gelesen und das ngGridEventScroll-Ereignis nicht gefunden. Ich werde das sicherlich versuchen. Wenn es funktioniert, dann frage ich mich, warum es nicht dokumentiert ist. – zszep

+1

finden Sie weitere Informationen auf ihrer Wiki-Seite https://github.com/angular-ui/ng-grid/wiki –

7

Hier ist das Beispiel für den ng-Grid mit unendlicher Scroll "ngGridEventScroll" Ereignisse verwenden. unterstützt die Gruppierung nach Filter und Sortierung.

Beispiel: http://plnkr.co/edit/AY68jf?p=preview

// main.js 
var app = angular.module('myApp', ['ngGrid']); 
app.controller('MyCtrl', function($scope) { 

    $scope.currentDataPosition = 1; 
    $scope.lastScrollPosition = 0; 
    $scope.mySelections = []; 
    $scope.myData = [{EmployeeName:"David", Emailaddress:"[email protected]", Technology:"MVC"}, 
        {EmployeeName:"Christina", Emailaddress:"[email protected]", Technology:"MVC"}, 
        {EmployeeName:"Peter", Emailaddress:"[email protected]", Technology:".Net"}, 
        {EmployeeName:"Jhon", Emailaddress:"[email protected]", Technology:"SP"}, 
        {EmployeeName:"Michel", Emailaddress:"[email protected]", Technology:"SP"}, 
        {EmployeeName:"Mark", Emailaddress:"[email protected]", Technology:"MVC"}, 
        {EmployeeName:"Reobert",Emailaddress:"[email protected]",Technology:".Net"} 

        ]; 

    $scope.gridOptions = 
     { 
     data: 'myData', 
     columnDefs: [ 
         {field:'EmployeeName', displayName:'Employee Name' ,width:'150px'}, 
         {field:'Emailaddress', displayName:'Email Address',width:'200px'}, 
         {field:'Technology', displayName:'Technology',width:'100px'} 
        ], 
     groups :['Technology'], 
     groupsCollapsedByDefault: false, 
     showSelectionCheckbox: true, 
     selectWithCheckboxOnly: false, 
     selectedItems: $scope.mySelections, 
     //multiSelect: true, 
     //filterOptions: {filterText: '', useExternalFilter: false}, 
     //showColumnMenu: true, 
     //showFilter: true, 
     }; 

    $scope.GetMoreData = function(position) 
    { 
     if(typeof(position) == 'undefined') 
     { 
      position = 0; 
     } 
     for (var i = 1 ; i < 31 ; i++) 
     { 
      var dep = "MVC"; 

      if(i % 3 == 0) 
      { 
      dep = "Consult"; 
      } 
      else if (i % 5 == 0) 
      { 
      dep = "Audit"; 
      } 
      else if (i % 7 == 0) 
      { 
      dep = "Audit"; 
      } 
      else if (i % 4 == 0) 
      { 
      dep = ".Net"; 
      } 

      var vPos = '('+position+')-' + i; 
      var name = "Employee"+vPos; 
      var email = name + "@abccompany.com"; 
      var employee = {EmployeeName:name,Emailaddress: email,Technology:dep} 
      $scope.myData.push(employee); 
     } 
    } 


    $scope.$on('ngGridEventScroll', function() 
    { 
     var ngGridView = $scope.gridOptions.ngGrid.$viewport[0]; 
     var scrollTop = ngGridView.scrollTop; 
     var scrollOffsetHeight = ngGridView.offsetHeight; 
     var currentScroll = scrollTop + scrollOffsetHeight; 
     var scrollHeight = ngGridView.scrollHeight; 
     console.log(scrollTop); 
     console.log(scrollHeight); 

     $scope.currentDataPosition++; 
     $scope.isLoading = true; 
     $scope.GetMoreData($scope.currentDataPosition); 
     $scope.isLoading = false; 
     console.log('Scrolled .. '); 
    }); 

    $scope.GetMoreData(1);     
}); 
+0

Ja, das ist die Art und Weise, wie ich es schließlich mit Hilfe von Alexin Coroshins Post umgesetzt habe. – zszep

Verwandte Themen