Saya memiliki fungsi dalam pengontrol sudut saya, saya ingin fungsi ini dijalankan pada dokumen siap tetapi saya perhatikan bahwa sudut menjalankannya saat dom dibuat.
function myController($scope)
{
$scope.init = function()
{
// I'd like to run this on document ready
}
$scope.init(); // doesn't work, loads my init before the page has completely loaded
}
Adakah yang tahu bagaimana saya bisa melakukan ini?
javascript
angularjs
onload
foreyez
sumber
sumber
$document
untuk menggunakannya.angular.element
bekerja di luar kotak.document
adalah variabel global di mana seperti$document
yang disuntikkan oleh sudut dan dengan demikian membuat pengujian lebih mudah. Secara umum sulit untuk menguji unit aplikasi yang mengakses variabel JS global seperti dokumen atau jendela. Saya juga berpikir itumodule.run
adalah tempat yang baik untuk meletakkan kode ini daripada pengontrol.Lihat posting ini. Bagaimana menjalankan fungsi pengontrol sudut pada pemuatan halaman?
Untuk pencarian cepat:
Dengan cara ini, Anda tidak perlu menunggu hingga dokumen siap.
sumber
https://docs.angularjs.org/guide/bootstrap
Ini berarti bahwa kode pengontrol akan berjalan setelah DOM siap.
Jadi itu adil
$scope.init()
.sumber
DOMContentLoaded
diaktifkan ketika dokumen telah dimuat dan diuraikan sepenuhnya, tanpa menunggu stylesheet, gambar, dan subframe selesai dimuat. Untuk informasi lebih lanjut, lihat Apa perbedaan antara DOMContentLoaded dan memuat acara? .Angular memiliki beberapa titik waktu untuk mulai menjalankan fungsi. Jika Anda mencari sesuatu seperti jQuery
Anda mungkin menemukan analog ini dalam sudut sangat berguna:
Yang ini sangat membantu ketika Anda ingin memanipulasi elemen DOM. Ini akan mulai dijalankan hanya setelah semua elemen dimuat.
UPD: Apa yang dikatakan di atas berfungsi ketika Anda ingin mengubah properti css. Namun, terkadang tidak berfungsi saat Anda ingin mengukur properti elemen, seperti lebar, tinggi, dll. Dalam hal ini Anda mungkin ingin mencoba ini:
sumber
Saya memiliki situasi yang sama di mana saya perlu menjalankan fungsi pengontrol setelah tampilan dimuat dan juga setelah komponen pihak ke-3 tertentu dalam tampilan dimuat, diinisialisasi, dan telah menempatkan referensi ke dirinya sendiri pada $ scope. Apa yang akhirnya berhasil bagi saya adalah mengatur jam tangan pada properti lingkup ini dan menjalankan fungsi saya hanya setelah diinisialisasi.
Pengamat disebut beberapa kali dengan nilai yang tidak ditentukan. Kemudian ketika grid dibuat dan memiliki properti yang diharapkan, fungsi inisialisasi dapat dengan aman dipanggil. Pertama kali pengamat dipanggil dengan newValue yang tidak ditentukan, oldValue akan tetap tidak terdefinisi.
sumber
Inilah upaya saya di dalam pengontrol luar menggunakan coffeescript. Ini bekerja dengan baik. Harap perhatikan bahwa settings.screen.xs | sm | md | lg adalah nilai statis yang ditentukan dalam file yang tidak di-uglifikasi yang saya sertakan dengan aplikasi. Nilai-nilai tersebut sesuai dengan breakpoint resmi Bootstrap 3 untuk ukuran kueri media eponymous:
sumber
Jawabannya
adalah satu-satunya yang berfungsi di sebagian besar skenario yang saya uji. Di halaman contoh dengan 4 komponen yang semuanya membangun HTML dari templat, urutan acara adalah
Jadi $ document.ready () tidak berguna dalam banyak kasus karena DOM yang sedang dibangun dalam sudut mungkin belum siap.
Tetapi lebih menarik, bahkan setelah $ viewContentLoaded dipecat, elemen yang menarik masih tidak dapat ditemukan.
Hanya setelah $ timeout dieksekusi ditemukan. Perhatikan bahwa meskipun batas waktu $ adalah nilai 0, hampir 200 milidetik berlalu sebelum dieksekusi, menunjukkan bahwa utas ini tertahan cukup lama, mungkin sementara DOM memiliki templat sudut ditambahkan pada utas utama. Total waktu dari $ document.ready () yang pertama ke eksekusi $ timeout terakhir adalah hampir 500 milidetik.
Dalam satu kasus luar biasa di mana nilai komponen ditetapkan dan kemudian nilai text () diubah kemudian dalam $ timeout, nilai $ timeout harus ditingkatkan hingga berfungsi (walaupun elemen dapat ditemukan selama $ timeout) ). Sesuatu async dalam komponen pihak ke-3 menyebabkan nilai lebih diutamakan dari teks sampai waktu yang cukup berlalu. Kemungkinan lain adalah $ scope. $ EvalAsync, tetapi belum dicoba.
Saya masih mencari satu peristiwa yang memberi tahu saya bahwa DOM telah sepenuhnya tenang dan dapat dimanipulasi sehingga semua kasus bekerja. Sejauh ini nilai batas waktu sewenang-wenang diperlukan, artinya setidaknya ini adalah kludge yang mungkin tidak berfungsi pada browser yang lambat. Saya belum mencoba opsi JQuery seperti liveQuery dan menerbitkan / berlangganan yang mungkin berfungsi, tetapi tentu saja tidak murni sudut.
sumber
Jika Anda mendapatkan sesuatu seperti
getElementById call returns null
, itu mungkin karena fungsinya berjalan, tetapi ID belum punya waktu untuk memuat di DOM.Coba gunakan jawaban Will (ke atas) dengan penundaan. Contoh:
sumber
Mengapa tidak mencoba dengan apa yang disebut dokumen sudut https://docs.angularjs.org/api/ng/function/angular.element .
Saya telah menggunakan ini di dalam fungsi $ onInit () {...} saya.
Ini berhasil untuk saya.
sumber
sumber