Der '$ apply' ist bereits in Bearbeitung'-Fehler, obwohl ich $ apply () nicht explizit anrufe

7

Ich erstelle eine Anweisung, die beim Hochladen einer CSV-Datei hilft. Ich verwende ein <input type="file" ng-hide="true"/> und das native JavaScript FileReader() , um dies zu tun. Alles funktioniert gut, wenn ich die Datei mit dem nativen input auswähle, aber ich habe versucht, das Datei-Steuerelement anzupassen, indem ich meine eigene Schaltfläche "Durchsuchen" verwende. Das Problem ist, wenn ich es auf diese Weise versuche, bekomme ich die $ apply ist bereits in Arbeit Fehler.

Hier ist meine Direktive

%Vor%

Wenn ich die Schaltfläche "Durchsuchen" für trigger('click') des uploadControl verwende, spuckt Angular den Fehler aus

%Vor%

Aber ich verwende scope.$apply() nirgends, damit ich das Problem nicht herausfinden kann. Es sollte einfach das click-Ereignis auf dem <input type="file"/> auslösen, das den systemeigenen Datei-Explorer des Betriebssystems aufrufen sollte.

Aktualisieren

Könnte es etwas mit diesem Problem zu tun haben?

Update 2

Nach ein paar weiteren Recherchen fand ich dieses Git-Problem , dass vojta (ein AngularJS-Entwickler) darauf reagierte Wir müssen das Ereignis in eine $timeout umbrechen. Ich habe das gemacht und es hat wirklich funktioniert! Könnte mir bitte jemand erklären, warum dies im Detail benötigt wird? Danke

    
Matt Hintzke 12.09.2014, 19:08
quelle

1 Antwort

24

Wenn Sie Änderungen am Gültigkeitsbereich vornehmen, ohne die Funktionen von Angular zu verwenden (z. B. mithilfe eines jQuery click-Ereignishandlers anstelle von ngClick ), wird dies sehr mürrisch. Manchmal ignoriert es deine Änderungen, bis es ein anderes Programm ausführt, und manchmal wirst du es in einem besonders mürrischen Moment bemerken, wenn es bereits mit anderen Dingen beschäftigt ist und du den Fehler bekommst, den du hast.

Um kanaltauglich zu sein, müssen Sie das Ereignissystem verwenden, um den Bereich zu aktualisieren. Wenn Sie das nicht können, können Sie ihm mitteilen, dass Sie Änderungen vornehmen, damit er diese Änderungen nach eigenem Zeitplan verarbeiten kann. So ist $timeout - eine angular-freundliche Version von JavaScript's timeout , die in die Update-Schleife integriert ist. Wenn Sie es ohne Dauerparameter aufrufen, bedeutet das nur: "Wenn Sie das nächste Mal bereit sind, Änderungen am Oszilloskop vorzunehmen, machen Sie dies."

Wenn Sie $apply selbst aufrufen, ist das übrigens keine gute Idee, verwenden Sie einfach $timeout .

    
Carson Myers 12.09.2014, 19:42
quelle

Tags und Links