Stapelspur:
Error: $apply already in progress
at Error (<anonymous>)
at beginPhase (file:///android_asset/www/built.min.js:7:22740)
at Object.Scope.$apply (file:///android_asset/www/built.min.js:7:25967)
at navigator.geolocation.getCurrentPosition.that (file:///android_asset/www/built.min.js:13:8670)
at Object.geolocation.getCurrentPosition (file:///android_asset/www/plugins/org.apache.cordova.core.geolocation/www/geolocation.js:122:13)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8589)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8277)
at Object.getCurrentCity (file:///android_asset/www/built.min.js:13:8941)
at Object.$scope.locateDevice (file:///android_asset/www/built.min.js:13:10480)
at file:///android_asset/www/built.min.js:7:12292:7
verweist auf diesen Code http://pastebin.com/B9V6yvFu
getCurrentPosition: cordovaReady(function (onSuccess, onError, options) {
navigator.geolocation.getCurrentPosition(function () {
var that = this,
args = arguments;
if (onSuccess) {
$rootScope.$apply(function () {
onSuccess.apply(that, args);
});
}
}, function () {
var that = this,
args = arguments;
if (onError) {
$rootScope.$apply(function () {
onError.apply(that, args);
});
}
}, {
enableHighAccuracy: true,
timeout: 20000,
maximumAge: 18000000
});
})
Seltsame Sache, auf meinem LG4X funktioniert es gut, aber auf meinem Samsung S2 wirft es den obigen Fehler. Irgendwelche Ideen, was ist falsch?
angularjs
cordova
angularjs-digest
Upvote
quelle
quelle
$timeout()
Antworten:
Sie erhalten diesen Fehler, weil Sie
$apply
innerhalb eines vorhandenen Verdauungszyklus aufrufen .Die große Frage ist: Warum rufst du an
$apply
? Sie sollten niemals anrufen müssen, es$apply
sei denn, Sie haben eine Schnittstelle zu einem Nicht-Angular-Ereignis. Die Existenz von$apply
bedeutet normalerweise, dass ich etwas falsch mache (es sei denn, das $ apply kommt wieder von einem Nicht-Angular-Ereignis).Wenn dies hier
$apply
wirklich angemessen ist, sollten Sie einen "Safe Apply" -Ansatz in Betracht ziehen:https://coderwall.com/p/ngisma
quelle
Verwenden Sie einfach $ evalAsync anstelle von
$apply
.quelle
Sie können diese Anweisung verwenden:
quelle
Wenn in einigen Fällen der Gültigkeitsbereich angewendet werden muss, können Sie eine Zeitüberschreitung festlegen, damit die $ -Anwendung bis zum nächsten Tick verschoben wird
oder verpacken Sie Ihren Code in ein $ timeout (function () {..}); weil der Bereich am Ende der Ausführung automatisch $ angewendet wird. Wenn Sie möchten, dass sich Ihre Funktion synchron verhält, würde ich das erste tun.
quelle
setTimeout(function() { $apply(function() {... do stuff ...} ) })
unten stehenden per @Tamil Vendhan aufnehmen musste.In meinem Fall verwende ich die
$apply
eckige Kalender-Benutzeroberfläche, um ein Ereignis zu verknüpfen:Nach dem Lesen des Dokuments des Problems: https://docs.angularjs.org/error/ $ rootScope / inprog
Der Teil Inkonsistente API (Sync / Async) ist sehr interessant:
Ich ändere den Code in:
Klappt wunderbar !
quelle
Ich denke, in Winkel 1.3 haben sie eine neue Funktion hinzugefügt -
$scope.$applyAsync()
. Diese Funktionsaufrufe gelten später - sie sagen mindestens 10 ms später. Es ist nicht perfekt, aber es beseitigt zumindest den lästigen Fehler.https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ applyAsync
quelle
Zu jedem Zeitpunkt kann nur eine
$digest
oder eine$apply
Operation ausgeführt werden. Dies soll verhindern, dass sehr schwer zu erkennende Fehler in Ihre Anwendung gelangen. Mit dem Stack-Trace dieses Fehlers können Sie den Ursprung des aktuell ausgeführten$apply
oder verfolgen$digest
aufgerufenen Aufrufs , der den Fehler verursacht hat.Weitere Informationen: https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply
quelle
Habe gerade dieses Problem behoben. Es ist hier dokumentiert .
Ich habe
$rootScope.$apply
zweimal im selben Flow angerufen . Alles, was ich getan habe, ist, den Inhalt der Servicefunktion mit einem zu versehensetTimeout(func, 1)
.quelle
Ich weiß, es ist eine alte Frage, aber wenn Sie wirklich $ scope brauchen. $ ApplyAsync ();
quelle
Ich rufe $ scope auf. $ Wendet sich so an, um mehrere Anrufe gleichzeitig zu ignorieren.
einfach anrufen
quelle