Saya punya masalah yang tampaknya sederhana tanpa solusi yang jelas (dengan membaca dokumen Angular JS) .
Saya mendapat arahan Angular JS yang melakukan beberapa kalkulasi berdasarkan tinggi elemen DOM lainnya untuk menentukan ketinggian wadah di DOM.
Sesuatu yang mirip dengan ini terjadi di dalam arahan:
return function(scope, element, attrs) {
$('.main').height( $('.site-header').height() - $('.site-footer').height() );
}
Masalahnya adalah ketika arahan berjalan, $('site-header')
tidak dapat ditemukan, mengembalikan array kosong sebagai ganti elemen DOM yang dibungkus jQuery yang saya butuhkan.
Apakah ada callback yang dapat saya gunakan dalam direktif saya yang hanya berjalan setelah DOM dimuat dan saya dapat mengakses elemen DOM lainnya melalui kueri gaya pemilih jQuery biasa?
Jawaban:
Itu tergantung pada bagaimana $ ('site-header') Anda dibuat.
Anda dapat mencoba menggunakan $ timeout dengan 0 penundaan. Sesuatu seperti:
Penjelasan cara kerjanya: satu , dua .
Jangan lupa untuk memasukkan
$timeout
arahan Anda:sumber
$timeout
memenuhi arahan. Doh. Semuanya bekerja sekarang, tepuk tangan.$timeout
ke arahan seperti ini:.directive('sticky', function($timeout) { return function (scope, element, attrs, controller) { $timeout(function(){ }); }); };
Inilah cara saya melakukannya:
sumber
element.ready(function(){
Mungkin penulis tidak membutuhkan jawaban saya lagi. Namun, demi kelengkapan, saya rasa pengguna lain mungkin menganggapnya berguna. Solusi terbaik dan paling sederhana adalah menggunakan
$(window).load()
di dalam tubuh fungsi yang dikembalikan. (Alternatifnya, Anda dapat menggunakandocument.ready
. Itu sangat tergantung apakah Anda membutuhkan semua gambar atau tidak).Menggunakan
$timeout
menurut pendapat saya adalah opsi yang sangat lemah dan mungkin gagal dalam beberapa kasus.Ini kode lengkap yang akan saya gunakan:
sumber
ada
ngcontentloaded
acara, saya pikir Anda bisa menggunakannyasumber
$ $window
sedang dilakukannya?Jika Anda tidak dapat menggunakan $ timeout karena sumber daya eksternal dan tidak dapat menggunakan perintah karena masalah waktu tertentu, gunakan siaran.
Tambahkan
$scope.$broadcast("variable_name_here");
setelah sumber daya eksternal yang diinginkan atau pengontrol / direktif yang berjalan lama selesai.Kemudian tambahkan di bawah ini setelah sumber daya eksternal Anda dimuat.
Misalnya dalam janji permintaan HTTP yang ditangguhkan.
sumber
Saya memiliki masalah serupa dan ingin membagikan solusi saya di sini.
Saya memiliki HTML berikut:
Masalah: Dalam fungsi tautan direktif div induk saya ingin membuat kueri div # sub anak. Tapi itu hanya memberi saya objek kosong karena ng-include belum selesai ketika fungsi tautan direktif dijalankan. Jadi pertama-tama saya membuat solusi kotor dengan $ timeout, yang berfungsi tetapi parameter penundaan bergantung pada kecepatan klien (tidak ada yang suka itu).
Bekerja tapi kotor:
Inilah solusi bersihnya:
Mungkin itu membantu seseorang.
sumber