Трассировки стека:
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
относится к этому коду 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
});
})
Странная вещь, на моем LG4X он работает нормально, но на моем samsung s2 выдает вышеуказанную ошибку. Есть идеи, что не так?
angularjs
cordova
angularjs-digest
Upvote
источник
источник
$timeout()
Ответы:
Вы получаете эту ошибку, потому что вызываете
$apply
внутри существующего цикла пищеварения.Большой вопрос: зачем ты звонишь
$apply
? Вам никогда не нужно звонить,$apply
если вы не взаимодействуете с не-Angular событием. Существование$apply
обычно означает, что я делаю что-то не так (если, опять же, $ apply не происходит из не-Angular события).Если это
$apply
действительно уместно, рассмотрите возможность использования подхода «безопасного применения»:https://coderwall.com/p/ngisma
источник
Просто используйте $ evalAsync вместо
$apply
.источник
Вы можете использовать это утверждение:
источник
Если в некоторых случаях должна применяться область видимости, вы можете установить тайм-аут, чтобы $ apply откладывалось до следующего тика.
или заключите свой код в $ timeout (function () {..}); потому что он автоматически $ применит область видимости в конце выполнения. Если вам нужно, чтобы ваша функция работала синхронно, я сделаю первое.
источник
setTimeout(function() { $apply(function() {... do stuff ...} ) })
@Tamil Vendhan ниже.В моем случае я использую
$apply
интерфейс календаря angular для привязки некоторого события:После прочтения документа о проблеме: https://docs.angularjs.org/error/ $ rootScope / inprog
Часть несогласованного API (Sync / Async) очень интересна:
Я меняю код на:
Работает как шарм!
источник
В angular 1.3, думаю, добавили новую функцию -
$scope.$applyAsync()
. Вызов этой функции применяется позже - говорят, по крайней мере, через 10 мс. Это не идеально, но, по крайней мере, устраняет досадную ошибку.https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ applyAsync
источник
В любой момент времени может быть только одна операция
$digest
или$apply
. Это сделано для того, чтобы очень трудно обнаружить ошибки, попадающие в ваше приложение. Трассировка стека этой ошибки позволяет отследить происхождение текущего исполняемого$apply
или$digest
вызова вызова, вызвавшего ошибку.Подробнее: https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply
источник
Только что решил эту проблему. Это задокументировано здесь .
Я звонил
$rootScope.$apply
дважды в одном потоке. Все, что я сделал, это обернул содержимое служебной функции расширениемsetTimeout(func, 1)
.источник
Я знаю, что это старый вопрос, но если вам действительно нужно использовать $ scope. $ ApplyAsync ();
источник
Я вызываю $ scope. $ Apply таким образом, чтобы игнорировать вызов несколько раз за один раз.
просто позвони
источник