$ aplicar já em andamento erro

Rastreamento de pilha:

Error: $apply already in progress at Error () 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 ele lança o erro acima. Alguma idéia do que está errado?

Você está recebendo este erro porque está chamando $apply dentro de um ciclo de digestão existente.

A grande questão é: por que você está chamando $apply ? Você não deve precisar pagar $apply menos que esteja fazendo uma interface de um evento não angular. A existência de $apply geralmente significa que estou fazendo algo errado (a menos que, novamente, o $ apply ocorra de um evento não angular).

Se $apply realmente for apropriado aqui, considere o uso de uma abordagem de “aplicação segura”:

https://coderwall.com/p/ngisma

Apenas use $ evalAsync em vez de $apply .

Você pode usar esta declaração:

 if ($scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest') { $scope.$apply(); } 

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

 setTimeout(function(){ scope.$apply(); }); 

ou coloque seu código em $ timeout (function () {..}); porque automaticamente aplicará o escopo no final da execução. Se você precisa da sua function para se comportar de forma síncrona, eu faria o primeiro.

Em 1.3 angular, eu acho, eles adicionaram uma nova function – $scope.$applyAsync() . Esta function chama a aplicar mais tarde – eles dizem que 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

No meu caso, eu uso $apply com a interface do usuário do calendar angular para vincular alguns events:

 $scope.eventClick = function(event){ $scope.$apply( function() { $location.path('/event/' + event.id); }); }; 

Depois de ler o documento do problema: https://docs.angularjs.org/error/ $ rootScope / inprog

A parte Inconsistent API (Sync / Async) é muito interessante:

Por exemplo, imagine uma biblioteca de terceiros que tenha um método que recupere dados para nós. Como pode estar fazendo uma chamada assíncrona para um servidor, ele aceita uma function de retorno de chamada, que será chamada quando os dados chegarem.

Como o construtor MyController é sempre instanciado a partir de uma chamada $ apply, nosso manipulador está tentando inserir um novo bloco $ apply dentro de um.

Eu mudo o código para:

 $scope.eventClick = function(event){ $timeout(function() { $location.path('/event/' + event.id); }, 0); }; 

Funciona como um encanto !

Aqui usamos $ timeout para agendar as alterações no escopo em uma futura pilha de chamadas. Ao fornecer um período de tempo limite de 0ms, isso ocorrerá o mais rápido possível e $ timeout garantirá que o código seja chamado em um único bloco $ apply.

A qualquer momento, pode haver apenas uma operação $digest ou $apply em andamento. Isso evita que seja muito difícil detectar erros ao entrar no seu aplicativo. O rastreamento de pilha desse erro permite rastrear a origem da chamada $apply ou $digest atualmente em execução, o que causou o erro.

Mais informações: https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply

Apenas resolvi esse problema. Está documentado aqui .

Eu estava chamando $rootScope.$apply duas vezes no mesmo stream. Tudo o que fiz foi envolver o conteúdo da function de serviço com um setTimeout(func, 1) .

Eu sei que é uma questão antiga, mas se você realmente precisa usar o $ scope. $ ApplyAsync ();

Eu chamo $ scope. $ Aplicar assim para ignorar chamada múltipla em um tempo.

  var callApplyTimeout = null; function callApply(callback) { if (!callback) callback = function () { }; if (callApplyTimeout) $timeout.cancel(callApplyTimeout); callApplyTimeout = $timeout(function () { callback(); $scope.$apply(); var d = new Date(); var m = d.getMilliseconds(); console.log('$scope.$apply(); call ' + d.toString() + ' ' + m); }, 300); } 

simplesmente ligue

 callApply();