2017-12-21 3 views
1

Für meine Angular 1.5 Datei-Upload-Komponente habe ich eine Vorschau implementiert.AngularJS langsam beim Rendern einer großen Zeichenfolge

Wenn der Benutzer eine Datei auswählt, sie durch eine FileReader und am Lastende gelesen wird, speichere ich die Inhalte in einer Steuerungsvariablen wie

fileReader.onloadend = function(ev) { 
    $rootScope.$evalAsync(function($scope) { 
     $ctrl.rawFileContent = ev.target.result; 
    }); 
}; 

Die Vorlage an den Benutzer zeigt

<pre ng-show="$ctrl.rawFileContent">{{$ctrl.rawFileContent}}</pre> 

Dies funktionierte ziemlich gut für meinen Test während der Entwicklung.

Das Problem

der realen Welt Benutzer laden wollen> 500kB Dateien und dann dauert es Minuten, bis die Vorlage gerendert wird.

Profiling zeigte, dass einige interne Funktionen in 'content-script.bundle.js' bei weitem die meiste Zeit benötigen.

Update: Und das Schlimmste von allem;) Es muss in IE11 laufen.

Was habe ich versucht, so weit

  1. einmal mit {{::$ctrl.rawFileContent}} Bindung, die keine Verbesserung ergab

  2. die <PRE> holen und seinen inneren Text über direkte DOM-Manipulation Einstellung, die noch lange dauert und schien ein Bit 'non-eckig' zu mir.

    <pre ng-show="$ctrl.rawFileContentReady" class="previewTarget"></pre>` 
    
    
    $rootScope.$evalAsync(function($scope) { 
        var previewTarget = document.getElementsByClassName("previewTarget")[0]; 
        previewTarget.innerHTML = ev.target.result; 
    }); 
    

Haben Sie irgendwelche Ideen, warum das so lange dauert?

Wie kann ich es beschleunigen?

Oder, als Workaround, kann ich den Fortschritt irgendwie verfolgen, um den Benutzer zu informieren?

+1

Ich frage mich immer noch, wie diese Vorschau einer 500k-Datei aussieht? es wäre hundert Seiten lang. – Rachmaninoff

+0

Lesen der Datei und zeigen es im Front-End ist es langsam oder angularJS Bindung? – Rachmaninoff

+1

War gespannt, wie viele Zeilen es bei einem 500 KB Text [Datei] geben könnte (http://www.sample-videos.com/download-sample-text-file.php). 1700 Textzeilen! Anstatt zu versuchen, alles zu rendern, können Sie mit [infinite scroll] (http://sroze.github.io/ngInfiniteScroll/) nur einen Teil der Datei rendern. – gilango

Antwort

-1
+0

Bitte erläutern Sie, wie Ihr Link für mein Problem relevant ist. Beachten Sie, dass mein Problem ist _nicht_ das Laden der Datei, sondern das Rendering danach. – DerMike

+0

Dies zeigt den Fortschritt während der Arbeit an. –

Verwandte Themen