Trace de la pile:
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
fait référence à ce 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
});
})
Chose étrange, sur mon LG4X, cela fonctionne bien, mais sur mon samsung s2, l'erreur ci-dessus est générée. Des idées qui ne vont pas?
angularjs
cordova
angularjs-digest
Vote favorable
la source
la source
$timeout()
Réponses:
Vous obtenez cette erreur parce que vous appelez
$apply
dans un cycle de digestion existant.La grande question est: pourquoi appelez-vous
$apply
? Vous ne devriez jamais avoir besoin d'appeler à$apply
moins que vous ne vous connectiez à partir d'un événement non angulaire. L'existence de$apply
signifie généralement que je fais quelque chose de mal (à moins que, encore une fois, $ apply ne provienne d'un événement non angulaire).Si
$apply
cela est vraiment approprié ici, envisagez d'utiliser une approche «d'application sûre»:https://coderwall.com/p/ngisma
la source
Utilisez simplement $ evalAsync au lieu de
$apply
.la source
Vous pouvez utiliser cette instruction:
la source
Si la portée doit être appliquée dans certains cas, vous pouvez définir un délai d'expiration pour que $ apply soit différé jusqu'au prochain tick
ou encapsulez votre code dans un $ timeout (function () {..}); car il appliquera automatiquement la portée à la fin de l'exécution. Si vous avez besoin que votre fonction se comporte de manière synchrone, je ferais la première.
la source
setTimeout(function() { $apply(function() {... do stuff ...} ) })
per @Tamil Vendhan ci-dessous.Dans mon cas, j'utilise
$apply
avec l'interface utilisateur du calendrier angulaire pour lier un événement:Après avoir lu la doc du problème: https://docs.angularjs.org/error/ $ rootScope / inprog
La partie API incohérente (Sync / Async) est très intéressante:
Je change le code en:
Fonctionne comme un charme!
la source
Dans angular 1.3, je pense, ils ont ajouté une nouvelle fonction -
$scope.$applyAsync()
. Ces appels de fonction s'appliquent plus tard - ils disent au moins 10 ms plus tard. Ce n'est pas parfait, mais cela élimine au moins l'erreur ennuyeuse.https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ applyAsync
la source
À tout moment, il ne peut y en avoir qu'une seule
$digest
ou une$apply
opération en cours. Cela permet d'éviter que des bogues très difficiles à détecter ne pénètrent dans votre application. La trace de pile de cette erreur vous permet de tracer l'origine de l'exécution$apply
ou de l'$digest
appel en cours, qui a provoqué l'erreur.Plus d'informations: https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply
la source
Je viens de résoudre ce problème. Son documenté ici .
J'appelais
$rootScope.$apply
deux fois dans le même flux. Tout ce que j'ai fait, c'est envelopper le contenu de la fonction de service avec un fichiersetTimeout(func, 1)
.la source
Je sais que c'est une vieille question mais si vous avez vraiment besoin d'utiliser $ scope. $ ApplyAsync ();
la source
J'appelle $ scope. $ S'applique comme ça à un appel ignoré multiple en une fois.
appelez simplement
la source