2017-04-03 2 views
0

Ich habe Leistungsprobleme bei der Verwendung von ng-repeat für lange Listen (Tausende von Datensätzen), die innerhalb einer Tabelle angezeigt werden müssen. Hierng-repeat zeigt schreckliche Leistung mit großen Listen

ist die HTML Ich verwende:

<table class="table table-hover"> 
     <thead> 
      <tr> 
       <th ng-repeat="One_Header in Data_List.Header track by $index">{{One_Header}}</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr ng-model="Data_List" ng-repeat="One_Source in Data_List.Body track by $index" style="cursor:pointer"> 
       <td ng-repeat="One_Data_Field in One_Source track by $index">{{One_Data_Field}}</td> 
      </tr> 
     </tbody> 
    </table> 

Die JSON erhalten (dauert ca. 1 Sekunde vom Server zu erhalten) enthält die Daten wie folgt:

"Data":{ 
     "Header":["Title_1","Title_2","Title_3"], 
     "Body":[ 
       ["Rec_1_Data_1","Rec_1_Data_2","Rec_1_Data_3"], 
       ["Rec_2_Data_1","Rec_2_Data_2","Rec_2_Data_3"], 
       ["Rec_3_Data_1","Rec_3_Data_2","Rec_3_Data_3"], 
       : 
       ["Rec_n_Data_1","Rec_n_Data_2","Rec_n_Data_3"] 
       ] 
} 

ich auch versuchte eine einseitige Bindung (dh {{::One_Data_Field}}) ohne irgendeine merkliche Verbesserung.

Wie oben erwähnt, kommt die Antwort innerhalb einer Sekunde an und es dauert bis zu 10 Sekunden, bis die Tabelle erstellt ist.

Jeder Vorschlag wird sehr geschätzt.

+7

Paginierung + lazy loading/endlos scrollen sind deine Freunde hier. – Fissio

+1

Sie können versuchen, vs-Wiederholung zu verwenden. https://github.com/kamilkp/angular-vs-repeat –

+0

Vielen Dank für Ihre Vorschläge. Leider bin ich ziemlich beschränkt auf die Anzahl der Bibliotheken, die ich in mein Projekt aufnehmen kann (Firmenpolitik ... frag nicht ...) und muss das irgendwie mit einem anderen Ansatz angehen. Ich dachte eher über etwas wie das Folgende nach: Zeige die ersten 100 Datensätze in die Tabelle, rende und füge Chunks in den Hintergrund ein (was natürlich zu einem erneuten Rendern führen wird, also bin ich mir nicht sicher, ob das so ist eine gute Idee überhaupt). – FDavidov

Antwort

0

Um die Leistung zu verbessern, können Sie Paginierungsdirektiven verwenden, die mit angular js erstellt wurden.

Angular-Paging

pagination

Wenn Sie Angular-Material-Design verwenden, dann würde ich sehr

virtual repeat

+0

Danke @sachilaranawaka. Bitte sehen Sie meinen Kommentar nach der ursprünglichen Frage und ein paar Kommentare von anderen Leuten. – FDavidov

0

mit virtueller Wiederholung empfehlen können Sie diese Probe Paginierung Implementierung versuchen:

 var pageSize = 15; 
     $scope.paginationLimit = function(pagesShown) { 
      return pageSize * pagesShown.count; 
     }; 

     $scope.hasMoreItemsToShow = function(list, pagesShown) { 
      return pagesShown.count < (list.length/pageSize); 
     }; 

     $scope.showMoreItems = function(pagesShown) {    
      pagesShown.count = pagesShown.count + 1; 
     }; 



     <tr ng-model="Data_List" ng-repeat="One_Source in Data_List.Body track by $index " style="cursor:pointer"> 
      <td ng-repeat="One_Data_Field in One_Source track by $index | limitTo: paginationLimit(pagesShown)">{{One_Data_Field}}</td> 
     </tr> 

     //sample row with show more button 
     <tr class="showMore">     
      <td></td> 
      <td class="showBtn"> 
       <button type="button" class="btn btn-primary btn-lg" ng-init="pagesShown={'count': 1}" ng-click="showMoreItems(pagesShown)" ng-show="hasMoreItemsToShow(One_Source track, pagesShown)">Show More</button> 
      </td>    
      <td></td> 
     </tr> 
+0

Danke @Amit. Bitte beachten Sie meinen Kommentar (nach meiner Frage und zwei Kommentaren). – FDavidov

Verwandte Themen