This tutorial demonstrates the use of the directive ngSrc
instead of src
:
<ul class="phones">
<li ng-repeat="phone in phones" class="thumbnail">
<img ng-src="{{phone.imageUrl}}">
</li>
</ul>
They ask to:
Replace the ng-src directive with a plain old src attribute.
Using tools such as Firebug, or Chrome's Web Inspector, or inspecting the webserver access logs, confirm that the app is indeed making an extraneous request to /app/%7B%7Bphone.imageUrl%7D%7D (or /app/{{phone.imageUrl}}).
I did so and it gave me the correct result:
<li class="thumbnail ng-scope" ng-repeat="phone in phones">
<img src="img/phones/motorola-xoom.0.jpg">
</li>
Is there a reason why?
The ngInit directive allows you to evaluate an expression in the current scope. This directive can be abused to add unnecessary amounts of logic into your templates. There are only a few appropriate uses of ngInit : aliasing special properties of ngRepeat , as seen in the demo below.
From Angular docs
The buggy way to write it:
<img src="http://www.gravatar.com/avatar/{{hash}}"/>
The correct way to write it:
<img ng-src="http://www.gravatar.com/avatar/{{hash}}"/>
Why? this is because on load of page, before angular bootstrapping and creation of controllers, browser will try to load image from http://www.gravatar.com/avatar/{{hash}}
and it will fail. Then once angular is started, it understands that that {{hash}}
has to be replaced with say logo.png
, now src attribute changes to http://www.gravatar.com/avatar/logo.png
and image correctly loads. Problem is that there are 2 requests going and first one failing.
TO solve this we should use ng-src
which is an angular directive and angular will replace ng-src
value into src attribute only after angular bootstrapping and controllers are fully loaded, and at that time {{hash}}
would have already been replaced with correct scope value.
<img ng-src="{{phone.imageUrl}}">
This gives you expected result, because phone.imageUrl
is evaluated and replaced by its value after angular is loaded.
<img src="{{phone.imageUrl}}">
But with this, the browser tries to load an image named {{phone.imageUrl}}
, which results in a failed request.
You can check this in the console of your browser.
The src="{{phone.imageUrl}}"
is unnecessary and creates an extra request by the browser. The browser will make at least 2 GET
requests attempting to load that image:
{{phone.imageUrl}}
img/phones/motorola-xoom.0.jpg
You should always use ng-src
directive when dealing with Angular expressions. <img ng-src="{{phone.imageUrl}}">
gives you the expected result of a single request.
On a side note, the same applies to ng-href
so you don't get broken links till the first digest cycle kicks in.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With