Jejak tumpukan:
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
merujuk pada kode ini 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
});
})
Anehnya, pada LG4X saya berfungsi dengan baik, namun pada samsung s2 saya melempar kesalahan di atas. Ada ide apa yang salah?
angularjs
cordova
angularjs-digest
Suara positif
sumber
sumber
$timeout()
Jawaban:
Anda mendapatkan kesalahan ini karena Anda menelepon
$apply
siklus pencernaan yang ada.Pertanyaan besarnya adalah: mengapa Anda menelepon
$apply
? Anda seharusnya tidak perlu menelepon$apply
kecuali Anda berinteraksi dari acara non-Angular. Keberadaan$apply
biasanya berarti saya melakukan sesuatu yang salah (kecuali, sekali lagi, $ berlaku terjadi dari peristiwa non-Angular).Jika
$apply
benar-benar sesuai di sini, pertimbangkan untuk menggunakan pendekatan "terapkan aman":https://coderwall.com/p/ngisma
sumber
Cukup gunakan $ evalAsync bukan
$apply
.sumber
Anda dapat menggunakan pernyataan ini:
sumber
Jika lingkup harus diterapkan dalam beberapa kasus, maka Anda dapat mengatur batas waktu sehingga $ berlaku ditangguhkan hingga centang selanjutnya
atau bungkus kode Anda dalam $ timeout (function () {..}); karena $ secara otomatis akan menerapkan lingkup di akhir eksekusi. Jika Anda membutuhkan fungsi Anda untuk berperilaku sinkron, saya akan melakukan yang pertama.
sumber
setTimeout(function() { $apply(function() {... do stuff ...} ) })
Vendhan per @ Tamil di bawah ini.Dalam kasus saya, saya menggunakan
$apply
dengan UI kalender sudut untuk menautkan beberapa acara:Setelah membaca dokumen masalah: https://docs.angularjs.org/error/ $ rootScope / inprog
Bagian Inconsistent API (Sync / Async) sangat menarik:
Saya mengubah kode menjadi:
Bekerja seperti pesona!
sumber
Di sudut 1.3, saya pikir, mereka menambahkan fungsi baru -
$scope.$applyAsync()
. Panggilan fungsi ini berlaku nanti - setidaknya sekitar 10 ms. Ini tidak sempurna, tetapi setidaknya menghilangkan kesalahan yang mengganggu.https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ applyAsync
sumber
Kapan pun, hanya ada satu
$digest
atau$apply
operasi yang sedang berjalan. Ini untuk mencegah sangat sulit mendeteksi bug memasuki aplikasi Anda. Tumpukan jejak kesalahan ini memungkinkan Anda untuk melacak asal dari saat ini melaksanakan$apply
atau$digest
panggilan , yang menyebabkan kesalahan.Info lebih lanjut: https://docs.angularjs.org/error/$rootScope/inprog?p0=$apply
sumber
Baru saja menyelesaikan masalah ini. Ini didokumentasikan di sini .
Saya menelepon
$rootScope.$apply
dua kali dalam aliran yang sama. Yang saya lakukan adalah membungkus isi fungsi layanan dengan asetTimeout(func, 1)
.sumber
Saya tahu ini pertanyaan lama tetapi jika Anda benar-benar perlu menggunakan $ scope. $ ApplyAsync ();
sumber
Saya memanggil $ scope. $ Berlaku seperti ini untuk mengabaikan panggilan berulang dalam satu kali.
cukup telepon
sumber