Tutorial ini mendemonstrasikan penggunaan direktif ngSrc
alih-alih src
:
<ul class="phones">
<li ng-repeat="phone in phones" class="thumbnail">
<img ng-src="{{phone.imageUrl}}">
</li>
</ul>
Mereka meminta untuk:
Ganti direktif ng-src dengan atribut src biasa yang lama.
Menggunakan alat seperti Firebug, atau Chrome Web Inspector, atau memeriksa log akses server web, mengonfirmasi bahwa aplikasi memang membuat permintaan asing ke /app/%7B%7Bphone.imageUrl%7D%7D (atau / app / {{phone .imageUrl}} ).
Saya melakukannya dan itu memberi saya hasil yang benar:
<li class="thumbnail ng-scope" ng-repeat="phone in phones">
<img src="img/phones/motorola-xoom.0.jpg">
</li>
Apakah ada alasannya mengapa?
Jawaban:
<img ng-src="{{phone.imageUrl}}">
Ini memberi Anda hasil yang diharapkan, karena
phone.imageUrl
dievaluasi dan diganti dengan nilainya setelah angular dimuat.<img src="{{phone.imageUrl}}">
Tapi dengan ini, browser mencoba memuat gambar bernama
{{phone.imageUrl}}
, yang mengakibatkan permintaan gagal. Anda dapat memeriksanya di konsol browser Anda.sumber
Dari Angular docs
Cara buggy untuk menulisnya:
<img src="http://www.gravatar.com/avatar/{{hash}}"/>
Cara yang benar untuk menulisnya:
<img ng-src="http://www.gravatar.com/avatar/{{hash}}"/>
Mengapa? Ini karena saat memuat halaman, sebelum bootstrap sudut dan pembuatan pengontrol, browser akan mencoba memuat gambar dari
http://www.gravatar.com/avatar/{{hash}}
dan itu akan gagal. Kemudian setelah sudut dimulai, ia memahami bahwa itu{{hash}}
harus diganti dengan saylogo.png
, sekarang atribut src berubah menjadihttp://www.gravatar.com/avatar/logo.png
dan gambar dimuat dengan benar. Masalahnya adalah ada 2 permintaan yang masuk dan yang pertama gagal.Untuk mengatasi ini kita harus menggunakan
ng-src
yang merupakan direktif sudut dan sudut akan mengganting-src
nilai menjadi atribut src hanya setelah bootstrap sudut dan pengontrol terisi penuh, dan pada saat{{hash}}
itu sudah akan diganti dengan nilai lingkup yang benar.sumber
Ini
src="{{phone.imageUrl}}"
tidak perlu dan membuat permintaan tambahan oleh browser. Browser akan membuat setidaknya 2GET
permintaan saat mencoba memuat gambar itu:{{phone.imageUrl}}
img/phones/motorola-xoom.0.jpg
Anda harus selalu menggunakan
ng-src
direktif saat berhadapan dengan ekspresi Angular.<img ng-src="{{phone.imageUrl}}">
memberi Anda hasil yang diharapkan dari satu permintaan.Di samping catatan , hal yang sama berlaku
ng-href
agar Anda tidak mendapatkan tautan yang rusak sampai siklus intisari pertama dimulai.sumber
Sebenarnya ini 100% masuk akal karena HTML diproses secara berurutan dan ketika halaman HTML ini sedang diproses baris demi baris, pada saat halaman tersebut sampai ke gambar ini, garis dan pemrosesan gambar, kita
phone.imageUrl
belum ditentukan.Faktanya, Angular JS belum memproses potongan HTML ini, dan belum mencari placeholder ini dan mengganti ekspresi ini dengan nilai. Jadi yang akhirnya terjadi adalah browser mendapatkan baris ini dan mencoba mengambil gambar ini di URL ini.
Dan tentu saja ini adalah URL palsu, jika masih memiliki kumis dan tanda kurung kurawal di dalamnya, dan karena itu memberi Anda 404, tapi sekali tentu saja Angular menangani ini, itu menggantikan URL ini dengan yang benar, dan kemudian kami masih melihat gambar, namun pesan kesalahan 404 tetap ada di konsol kami.
Jadi, bagaimana kita bisa menangani ini? Yah, kita tidak bisa menangani ini dengan menggunakan trik HTML biasa. Tapi, kita bisa mengatasinya dengan Angular. Kami harus memberi tahu browser untuk tidak mencoba mengambil URL ini, tetapi pada saat yang sama mengambilnya hanya saat Angular siap untuk interpretasi placeholder ini.
Nah, salah satu cara untuk melakukannya adalah dengan menempatkan atribut Angular di sini, bukan HTML standar. Dan atribut Angular itu adil
ng-src
. Jadi jika kita mengatakannya sekarang, kembali, Anda akan melihat bahwa tidak ada kesalahan lagi karena gambar hanya diambil setelah Angular mendapatkan HTML ini dan menerjemahkan semua ekspresi ke dalam nilainya.sumber