Seguimiento de pila:
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
se refiere 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
});
})
Lo extraño es que en mi LG4X funciona bien, sin embargo, en mi samsung s2 arroja el error anterior. ¿Alguna idea de lo que está mal?
angularjs
cordova
angularjs-digest
Voto a favor
fuente
fuente
$timeout()
Respuestas:
Recibe este error porque está llamando
$apply
dentro de un ciclo de digestión existente.La gran pregunta es: ¿por qué llamas
$apply
? Nunca debería necesitar llamar a$apply
menos que esté interactuando desde un evento no angular. La existencia de$apply
usualmente significa que estoy haciendo algo mal (a menos que, nuevamente, la aplicación $ suceda debido a un evento no angular).Si
$apply
realmente es apropiado aquí, considere usar un enfoque de "aplicación segura":https://coderwall.com/p/ngisma
fuente
Simplemente use $ evalAsync en lugar de
$apply
.fuente
Puedes usar esta declaración:
fuente
Si se debe aplicar el alcance en algunos casos, puede establecer un tiempo de espera para que el $ apply se difiera hasta el siguiente tic
o envuelva su código en $ timeout (function () {..}); porque $ aplicará automáticamente el alcance al final de la ejecución. Si necesita que su función se comporte de forma sincrónica, yo haría lo primero.
fuente
setTimeout(function() { $apply(function() {... do stuff ...} ) })
@Tamil Vendhan a continuación.En mi caso, uso
$apply
con la interfaz de usuario de calendario angular para vincular algún evento:Después de leer el documento del problema: https://docs.angularjs.org/error/ $ rootScope / inprog
La parte API inconsistente (Sync / Async) es muy interesante:
Cambio el código a:
Funciona de maravilla !
fuente
En angular 1.3, creo, agregaron una nueva función -
$scope.$applyAsync()
. Las llamadas a esta función se aplican más adelante; dicen aproximadamente 10 ms más tarde al menos. No es perfecto, pero al menos elimina el molesto error.https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ applyAsync
fuente
En cualquier momento, solo puede haber una
$digest
u$apply
operación en progreso. Esto es para evitar que los errores muy difíciles de detectar ingresen a su aplicación. El seguimiento de la pila de este error le permite rastrear el origen de la llamada$apply
o ejecución actual$digest
, que causó el error.Más información: https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply
fuente
Acabo de resolver este problema. Está documentado aquí .
Estaba llamando
$rootScope.$apply
dos veces en el mismo flujo. Todo lo que hice fue envolver el contenido de la función de servicio con unsetTimeout(func, 1)
.fuente
Sé que es una pregunta antigua, pero si realmente necesitas usar $ scope. $ ApplyAsync ();
fuente
Llamo a $ scope. $ Se aplica así a llamadas ignoradas múltiples en una sola vez.
simplemente llama
fuente