Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ngSrc is computed before ngIf causing unnecessary http request

When you write something like:

<img ng-if="image.name != null" ng-src="img/{{ image.name }}_img.png" />

If image.name = null Angular will first add tag and evaluate src. The browser will make http request for img/_img.png wchich doesn't exists. Then angular will remove tag after parsing ngIf directive. What is the simplest way to resolve this issue? I thought that it's perfect use case for ngSrc and ngIf.

EDIT

In current unstable 1.2.0-rc.2 issue is fixed and everything works how it is supposed to do. In current stable 1.0.8 you can't even use ternary operator.

like image 928
p2004a Avatar asked Dec 04 '22 09:12

p2004a


2 Answers

You don't need the ng-if directive for this. Just do a ternary operator test in your expression. Something like

<img ng-src="{{image.name?('img/'+ image.name +'_img.png'):null}}"/>

and it should work. See my plunker http://plnkr.co/edit/BWiGdO?p=preview

like image 172
Chandermani Avatar answered May 12 '23 01:05

Chandermani


You can do it like this with a simple directive.

Here is the HTML :

<!DOCTYPE html>
<html ng-app="App">

  <head>
    <link rel="stylesheet" href="style.css">
    <script src="http://code.angularjs.org/1.2.0-rc.2/angular.js"></script>
    <script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
    <script src="script.js"></script>
  </head>

  <body ng-controller="MyCtrl">
    <h1>Hello Plunker!</h1>
    <img ng-directive />
  </body>

</html>

Here is the directive with the controller :

angular.module('App', [])
  .controller('MyCtrl', function($scope){
     $scope.image = {name: "myName"};
  });

angular.module('App')
  .directive('ngDirective', function($compile){
    return {
      link: function(scope, element, attrs){
        if(scope.image.name != null){
          $compile($(element).attr('ng-src', 'http://lauterry.github.io/slides-prez-angular/img/angularjs.png'))(scope);
        }
      }
    }
  });

Here is the complete working example : http://plnkr.co/edit/LNgsuX

like image 21
Thomas Pons Avatar answered May 12 '23 01:05

Thomas Pons