5

Ich habe ein Problem der Leistung und ich finde die Lösung nicht.Wie kann die ng-repeat-Leistung mit Smart-Table gesteigert werden?

Kontext: Ich muss eine Menge Daten (500 Zeilen, 8 Spalten) in einer Tabelle anzeigen. Um diese Daten anzuzeigen, wählte ich Smart-Tabelle, weil es eine gute Funktionalität bietet, aber das Problem ist, dass ich eine Menge Daten habe und die Zeit der Datenanzeige sehr lang ist (5 - 9 Sekunden, abhängig von der Geräteleistung).

Wichtige Sache: Ich muss alle Daten anzeigen, so dass ich keine Paginierung Methode, Filter begrenzen möchte.

Also dieser Code funktioniert:

<ion-scroll class="scrollVertical" direction="xy" overflow-scroll="true" > 
      <table st-table="tableaux" class="table table-striped"> 
        <thead> 
         <tr> 
          <th ng-repeat="column in ColumnTable">{{column.Label}}</th> 
         </tr> 
         <tr> 
          <th ng-repeat="column in ColumnTable"> 
           <input st-search="{{column.Id}}" placeholder="" class="input-sm form-control" type="search" ng-model="inputRempli"/> 
          </th> 
         </tr> 
        </thead> 
        <tbody> 
         <tr ng-repeat="row in tableaux"> 
          <td ng-repeat="column in ColumnTable" ng-init="colonne = column.Id">{{row[colonne]}}</td> 
         </tr> 
        </tbody> 
       </table> 
    </ion-scroll> 

ich gelesen, dass Ionic eine Richtlinie gemacht (collection-repeat) wich ermöglicht eine App riesige Listen von Elementen zu zeigen, viel mehr performant als ng-repeat. Also habe ich versucht, meine Lösung mit sammel wiederholen Remake aber das nicht funktioniert ...

-Code Sammlung-repeat Lösung:

<ion-scroll class="scrollVertical"> 
     <table st-table="tableaux" class="table table-striped"> 
      <thead> 
       <tr> 
        <th ng-repeat="column in ColumnTable">{{column.Label}}</th> 
       </tr> 
       <tr> 
        <th ng-repeat="column in ColumnTable"> 
         <input st-search="{{column.Id}}" placeholder="" class="input-sm form-control" type="search" ng-model="inputRempli"/> 
        </th> 
       </tr> 
      </thead> 
      <tbody> 
       <tr collection-repeat="row in tableaux" item-width="200px" item-height="100px"> 
        <td collection-repeat="column in ColumnTable" ng-init="colonne = column.Id" item-width="100px" item-height="100px">{{row[colonne]}}</td> 
       </tr> 
      </tbody> 
     </table> 
    </ion-scroll> 

Fehler: Maximale Call-Stack-Größe überschritten

Fragen: Gibt es eine angularjs oder ionische Lösung, um die Leistung von Smart-Table mit vielen Daten zu erhöhen? Was stimmt nicht mit meiner Sammlung-wiederholen?

+1

versucht es einmal zu binden, zB: Zeile in :: tableaux –

+0

leid, das zu sagen, aber Sie sind eine mobile App zu bauen. Aus Sicht von UX ist das nicht das Beste, um 500 Zeilen mit je 8 Spalten anzuzeigen, daher glaube ich, dass dies das Hauptproblem ist, das Sie lösen müssen. – ThiagoPXP

+0

Ich stimme völlig mit Ihnen überein, dass die Anzeige von 500 Zeilen und 8 Spalten nicht das Beste ist. Aber die Kunden wollen es ... Ich weiß nicht, ob es eine Lösung gibt. – carton

Antwort

0

Welche Version von Ionic verwenden Sie? Wenn Sie Version 1.0 Beta 14 oder höher verwenden, verwenden Sie bind once (nativ in Angular 1.3)

Es wäre so.

+0

Danke für diese Antwort, aber das ändert nicht Ladezeit (ich getestet auf meinem Smartphone und es laden während 5 Sekunden, um es anzuzeigen) .Mehr darüber, wenn ich binden einmal mein Filter nicht funktioniert. (Ich benutze die neueste Version von ionic) – carton

0

Wie laden Sie Ihre Daten?

Wenn Sie eine $scope.ColumnTable.push(newData); tun, dann ist dies kein geeigneter Weg, es zu tun.

Was ich tue, ist:

  • einen Dienst erstellen, die eine temporäre Tabelle zu laden: Lassen Sie uns es nennen myService.setTable().

  • Informieren Sie Ihren Controller mit einem Ereignis: Dieser Dienst sendet ein Ereignis $rootScope.$broadCast("myService.setTable-refresh")

  • Fang das Ereignis in Ihrem Controller & Aktualisierungstabelle: $scope.$on('myService.setTable-refresh,function(){ $scope.myWorkingTable =myService.getTable();});

  • Aktualisieren Sie Ihre HTML arbeiten mit myWorkingTable

Darüber hinaus müssen Sie einen eindeutigen Schlüssel in Ihre ng-repeat für Leistung o definieren ptimization von track by verwendet, um die Neuerstellung bereits erstellter Inhalte zu verhindern.

Siehe Erläuterung hier: http://www.bennadel.com/blog/2556-using-track-by-with-ngrepeat-in-angularjs-1-2.htm

+0

Sorry für meine späte Antwort, meine Daten sind in einem Objekt in meinem Service und ich injiziere diesen Service und rufen Sie eine Funktion, um Daten zu erhalten. Ich denke, Ihre Lösung könnte gut sein, aber sie wird das Problem der Leistung nicht lösen, da nur die Anzeige von Daten zu Performance-Problemen führt. Ich habe den Track schon probiert und es ist nicht wirklich besser. – carton

Verwandte Themen