Rastreio de pilha:
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
refere-se a este código 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
});
})
Coisa estranha, no meu LG4X funciona bem, no entanto, no meu samsung s2, lança o erro acima. Alguma idéia que está errado?
angularjs
cordova
angularjs-digest
Voto a favor
fonte
fonte
$timeout()
Respostas:
Você está recebendo esse erro porque está chamando
$apply
dentro de um ciclo de digestão existente.A grande questão é: por que você está ligando
$apply
? Você nunca precisa ligar, a$apply
menos que esteja fazendo interface com um evento não angular. A existência de$apply
geralmente significa que estou fazendo algo errado (a menos que, novamente, o $ apply ocorra a partir de um evento não angular).Se
$apply
realmente for apropriado aqui, considere usar uma abordagem de "aplicação segura":https://coderwall.com/p/ngisma
fonte
Basta usar $ evalAsync em vez de
$apply
.fonte
Você pode usar esta declaração:
fonte
Se o escopo precisar ser aplicado em alguns casos, você poderá definir um tempo limite para que o $ apply seja adiado até o próximo tick
ou envolva seu código em $ timeout (function () {..}); porque ele aplicará automaticamente o escopo no final da execução. Se você precisa que sua função se comporte de forma síncrona, eu faria o primeiro.
fonte
setTimeout(function() { $apply(function() {... do stuff ...} ) })
@Tamil Vendhan abaixo.No meu caso, eu uso
$apply
com a interface do usuário do calendário angular para vincular algum evento:Depois de ler o documento do problema: https://docs.angularjs.org/error/ $ rootScope / inprog
A parte API inconsistente (Sync / Async) é muito interessante:
Eu mudo o código para:
Funciona como um encanto !
fonte
No angular 1.3, eu acho, eles adicionaram uma nova função -
$scope.$applyAsync()
. Essas chamadas de função se aplicam mais tarde - elas dizem cerca de 10 ms mais tarde, pelo menos. Não é perfeito, mas pelo menos elimina o erro irritante.https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ applyAsync
fonte
A qualquer momento, pode haver apenas uma
$digest
ou$apply
operação em andamento. Isso evita que bugs muito difíceis de detectar entrem no seu aplicativo. O rastreamento da pilha desse erro permite rastrear a origem da chamada$apply
ou execução em execução$digest
, que causou o erro.Mais informações: https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply
fonte
Apenas resolvi esse problema. Está documentado aqui .
Eu estava ligando
$rootScope.$apply
duas vezes no mesmo fluxo. Tudo o que fiz foi agrupar o conteúdo da função de serviço com asetTimeout(func, 1)
.fonte
Eu sei que é uma pergunta antiga, mas se você realmente precisar usar $ scope. $ ApplyAsync ();
fonte
Eu chamo $ scope. $ Aplicam-se assim a chamadas ignoradas várias de uma vez.
simplesmente chame
fonte