Saya mengerti AngularJS menjalankan beberapa kode dua kali, kadang-kadang bahkan lebih, seperti $watch
acara, terus-menerus memeriksa status model dll.
Namun kode saya:
function MyController($scope, User, local) {
var $scope.User = local.get(); // Get locally save user data
User.get({ id: $scope.User._id.$oid }, function(user) {
$scope.User = new User(user);
local.save($scope.User);
});
//...
Dieksekusi dua kali, memasukkan 2 catatan ke dalam DB saya. Aku jelas masih belajar karena aku telah membenturkan kepalaku melawan ini sejak lama!
ng-app
dan dengan bootstrap manual). Juga periksa apakah Anda telah memasang controller Anda ke beberapa elemen (dengan ng-controller).Jawaban:
Router aplikasi menentukan navigasi agar
MyController
seperti ini:Tapi saya juga punya ini di
home.html
:Ini mencerna pengontrol dua kali. Menghapus
data-ng-controller
atribut dari HTML menyelesaikan masalah. Atau,controller:
properti mungkin telah dihapus dari arahan perutean.Masalah ini juga muncul saat menggunakan navigasi tab. Misalnya,
app.js
mungkin mengandung:HTML laporan tab yang sesuai mungkin menyerupai:
Ini juga akan menghasilkan menjalankan pengontrol dua kali.
sumber
<div ng-view>...
ke<div class="ng-view">...
, masalah ini berhenti untuk saya. Saya belum pernah menemukan perilaku ini sebelumnya, tetapi mungkin orang lain juga memiliki ini.Ketika Anda menggunakan ngRoute dengan
ng-view
direktif, controller akan terpasang ke elemen dom secara default (atau ui-view jika Anda menggunakan ui-router). Jadi Anda tidak perlu melampirkannya lagi di templat.sumber
Saya baru saja membahas ini, tetapi masalahnya berbeda dari jawaban yang diterima. Saya benar-benar meninggalkan ini di sini untuk masa depan saya sendiri, untuk memasukkan langkah-langkah yang saya lalui untuk memperbaikinya.
ng-ifs
ng-view
panggilan pembungkus yang tidak perlu (saya tidak sengaja meninggalkan panggilanng-view
yang sebenarnyang-view
. Ini menghasilkan tiga panggilan ke pengontrol saya.)turbolinks
permata dariapplication.js
file Anda . Saya menghabiskan sepanjang hari untuk menemukan itu. Ditemukan jawabannya di sini .sumber
turbolinks
gem dariapplication.js
file Anda . Itu membuatku gila, terbuang seharian untuk menemukan itu. Rasa sakit yang nyata. Ditemukan jawaban di siniHanya ingin menambahkan satu case lagi ketika controller dapat init dua kali (ini sebenarnya untuk angular.js 1.3.1):
Dalam hal ini $ route.current akan ditetapkan ketika ng-view akan init. Itu menyebabkan inisialisasi ganda.
Untuk memperbaikinya ubah saja ng-jika ke ng-show / ng-hide dan semua akan bekerja dengan baik.
sumber
ui-view
dua kali yang disebut controller dua kali.Ingin menambahkan referensi:
Eksekusi kode pengontrol ganda juga dapat disebabkan oleh referensi pengontrol dalam arahan yang juga berjalan di halaman.
misalnya
Ketika Anda juga memiliki ng-controller = "myController" di HTML Anda
sumber
Saat menggunakan angular-ui-router dengan Angular 1.3+, ada masalah tentang tampilan Rendering dua kali pada transisi rute . Ini menghasilkan pengontrol dua kali juga. Tak satu pun dari solusi yang diusulkan bekerja untuk saya.
Namun, memperbarui
angular-ui-router
dari 0,2,11 menjadi 0,2,13 memecahkan masalah bagi saya.sumber
Saya merobek aplikasi saya dan semua ketergantungannya untuk mengatasi masalah ini (detailnya di sini: Aplikasi AngularJS memulai dua kali (mencoba solusi yang biasa ..) )
Dan pada akhirnya, itu semua adalah kesalahan plugin Chrome Batarang.
Resolusi dalam jawaban ini :
Saya sangat merekomendasikan hal pertama pada daftar siapa pun adalah untuk menonaktifkannya per posting sebelum mengubah kode.
sumber
Jika Anda tahu pengontrol Anda secara tidak sengaja mengeksekusi lebih dari satu kali, coba cari melalui file Anda untuk nama controller yang menyinggung, mis: cari: MyController melalui semua file. Kemungkinan itu disalin dari beberapa file html / js lainnya dan Anda lupa untuk mengubahnya ketika Anda mengembangkan atau menggunakan parsial / pengendali tersebut. Sumber: Saya membuat kesalahan ini
sumber
Saya memiliki masalah yang sama, dalam aplikasi sederhana (tanpa routing dan referensi ng-controller sederhana) dan konstruktor pengendali saya berjalan dua kali. Akhirnya, saya menemukan bahwa masalah saya adalah deklarasi berikut untuk auto-bootstrap aplikasi AngularJS saya di tampilan Razor saya
Saya juga telah secara manual bootstrap menggunakan angular.bootstrap yaitu
jadi menghapus salah satu dari mereka, itu berhasil untuk saya.
sumber
Dalam beberapa kasus, arahan Anda berjalan dua kali ketika Anda tidak benar-benar menutup arahan Anda seperti ini:
<my-directive>Some content<my-directive>
Ini akan menjalankan arahan Anda dua kali. Juga ada kasus lain yang sering terjadi ketika arahan Anda berjalan dua kali:
pastikan Anda tidak memasukkan arahan Anda dalam
index.html
DUA KALI Anda !sumber
Telah menggaruk-garuk kepala saya atas masalah ini dengan AngularJS 1.4 rc build, kemudian menyadari bahwa tidak ada jawaban di atas yang berlaku karena berasal dari perpustakaan router baru untuk Angular 1.4 dan Angular 2 pada saat penulisan ini. Oleh karena itu, saya menjatuhkan catatan di sini untuk siapa saja yang mungkin menggunakan perpustakaan rute Angular baru.
Pada dasarnya jika halaman html berisi
ng-viewport
arahan untuk memuat bagian dari aplikasi Anda, dengan mengklik hyperlink yang ditentukan denganng-link
akan menyebabkan pengontrol target komponen terkait dimuat dua kali. Perbedaannya adalah, jika browser telah memuat pengontrol target, dengan mengklik kembali hyperlink yang sama hanya akan memanggil pengontrol satu kali.Belum menemukan solusi yang layak, meskipun saya percaya perilaku ini konsisten dengan pengamatan yang diangkat oleh shaunxu , dan mudah-mudahan masalah ini akan diselesaikan di masa depan membangun perpustakaan rute baru dan bersama dengan rilis AngularJS 1.4.
sumber
Dalam kasus saya, saya menemukan dua tampilan menggunakan pengontrol yang sama.
sumber
Masalah yang saya temui mungkin bersifat tangensial, tetapi karena googling membawa saya ke pertanyaan ini, ini mungkin tepat. Masalahnya adalah kepalanya yang jelek bagi saya ketika menggunakan Router UI, tetapi hanya ketika saya mencoba untuk me-refresh halaman dengan tombol refresh browser. Aplikasi ini menggunakan Router UI dengan keadaan abstrak induk, dan kemudian anak menyatakan dari induknya. Pada
run()
fungsi aplikasi , ada$state.go('...child-state...')
perintah. Status induk menggunakan aresolve
, dan pada awalnya saya pikir mungkin pengendali anak mengeksekusi dua kali.Semuanya baik-baik saja sebelum URL memiliki hash yang ditambahkan.
www.someoldwebaddress.org
Kemudian setelah url telah dimodifikasi oleh UI Router,
www.someoldwebaddress.org#/childstate
... dan kemudian ketika saya me-refresh halaman dengan tombol refresh browser ,
$stateChangeStart
api dua kali, dan setiap kali menunjuk kechildstate
.Pada
resolve
status induk adalah apa yang menembak dua kali.Mungkin ini adalah kludge; bagaimanapun, hal ini tampaknya menghilangkan masalah bagi saya: di area kode di mana
$stateProvider
pertama kali dipanggil, periksa terlebih dahulu untuk melihat apakah window.location.hash adalah string kosong. Jika ya, semuanya baik; jika tidak, maka atur window.location.hash ke string kosong. Maka tampaknya$state
hanya mencoba untuk pergi ke suatu tempat sekali daripada dua kali.Juga, jika Anda tidak ingin bergantung pada default aplikasi
run
danstate.go(...)
, Anda dapat mencoba untuk menangkap nilai hash dan menggunakan nilai hash untuk menentukan status anak tempat Anda berada sebelum penyegaran halaman, dan menambahkan kondisi ke area di Anda kode tempat Anda mengaturstate.go(...)
.sumber
Dalam kasus saya itu karena pola url yang saya gunakan
url saya seperti / ui / project /: parameter1 /: parameter2.
Saya tidak perlu paramerter2 dalam semua kasus perubahan negara. Dalam kasus di mana saya tidak memerlukan parameter kedua url saya akan seperti / ui / project /: parameter1 /. Dan setiap kali saya mengalami perubahan status saya akan memiliki controller saya di-refresh dua kali.
Solusinya adalah dengan mengatur parameter2 sebagai string kosong dan melakukan perubahan status.
sumber
Saya mendapatkan inisialisasi rangkap ini terjadi karena alasan yang berbeda. Untuk beberapa transisi rute dalam aplikasi saya, saya ingin memaksa pengguliran ke dekat bagian atas halaman (mis. Dalam hasil pencarian paginasi ... mengklik berikutnya akan membawa Anda ke atas halaman 2).
Saya melakukan ini dengan menambahkan pendengar
$rootScope
$on
$viewContentLoaded
yang (berdasarkan kondisi tertentu) dieksekusiSecara tidak sengaja ini menyebabkan rute saya dievaluasi ulang dan pengendali diinisialisasi ulang
sumber
Masalah saya memperbarui parameter pencarian seperti itu
$location.search('param', key);
Anda dapat membaca lebih lanjut di sini
controller dipanggil dua kali karena menambahkan params di url
sumber
Dalam kasus saya mengganti nama controller ke nama yang berbeda menyelesaikan masalah.
Ada konflik nama pengontrol dengan modul " angular-ui-tree ": Saya mengganti nama pengontrol dari "CatalogerTreeController" menjadi " TreeController " dan kemudian pengontrol ini mulai dijalankan dua kali pada halaman di mana arahan " ui-tree " digunakan karena arahan ini menggunakan kontroler bernama " TreeController ".
sumber
Bagi mereka yang menggunakan sintaks ControllerAs, cukup deklarasikan label controller di $ routeprovider sebagai berikut:
atau
Setelah mendeklarasikan $ routeprovider, jangan berikan controller seperti pada tampilan. Alih-alih gunakan label pada tampilan.
sumber
Saya memiliki masalah yang sama dan setelah mencoba semua jawaban saya akhirnya menemukan bahwa saya memiliki arahan dalam pandangan saya yang terikat pada pengontrol yang sama.
Setelah menghapus arahan, pengontrol berhenti dipanggil dua kali. Sekarang pertanyaan saya adalah, bagaimana bisa menggunakan direktif ini terikat pada ruang lingkup controller tanpa masalah ini
sumber
Saya baru saja menyelesaikan masalah saya, yang sebenarnya cukup mengecewakan. Ini adalah aplikasi hybrid ionik, saya telah menggunakan ui-router v0.2.13. Dalam kasus saya ada pembaca epub (menggunakan epub.js) yang terus-menerus melaporkan "tidak ada dokumen yang ditemukan" begitu saya menavigasi ke perpustakaan buku saya dan memilih buku lainnya. Ketika saya memuat ulang buku browser sedang diterjemahkan dengan sempurna tetapi ketika saya memilih buku lain mendapat masalah yang sama lagi.
Penyelesaian saya sangat sederhana. Saya baru saja dihapus
reload:true
dari$state.go("app.reader", { fileName: fn, reload: true });
dalamLibraryController
sumber
Saya memiliki masalah yang sama
[email protected]
, dan itu karena garis miring ekstra di akhir rute regex:untuk
dan itu bekerja dengan benar.
sumber
Cukup tambahkan kasus saya di sini juga:
Saya menggunakan angular-ui-router dengan
$state.go('new_state', {foo: "foo@bar"})
Setelah saya menambahkan encodeURIComponent untuk parameter, masalah itu pergi:
$state.go('new_state', {foo: encodeURIComponent("foo@bar")})
.Apa yang terjadi? Karakter "@" dalam nilai parameter tidak diizinkan di URL. Sebagai akibatnya, angular-ui-router membuat pengontrol saya dua kali: selama kreasi pertama ia melewati "foo @ bar" asli, selama kreasi kedua akan melewati versi yang disandikan "foo% 40bar". Setelah saya secara eksplisit menyandikan parameter seperti yang ditunjukkan di atas, masalahnya hilang.
sumber
Saya tahu saya dipanggil dua kali karena saya memanggil metode dua kali dari html saya.
Bagian yang disorot menyebabkan findX () dipanggil dua kali. Semoga ini bisa membantu seseorang.
sumber