angularjs image loading preloader.

angularjs, directive, $watch, jQuery

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<input type='radio' ng-model="src" value="https://stephenlewisfoundation.files.wordpress.com/2010/05/mural-big-shoes-south-africa-kristina-laukkanen-may-3-2010.jpg">

<input type='radio' ng-model="src" value="https://d2fijpsef22722.cloudfront.net/photos/massive/1942178592-big-island.jpg">

<br/>
<br/>
<div ng-controller="c" id='bing'>
  <img class="spinner" src="{{src}}" width='200' imageonload />
  <span class="loading"> <img src="https://www.yugma.com/images/loading-animation-7.gif"/></span>

</div>

CSS

.spinner-hide .loading {
              visibility: visible;
            }
            
            .spinner-show .loading {
              visibility: hidden;
            }

JavaScript

var app = angular.module('app', []);

app.directive('imageonload', function() {
  return {
    restrict: 'A',

    link: function(scope, element) {
      element.bind('load', function() {
        // Set visibility: true + remove spinner overlay
        jQuery('#bing').removeClass('spinner-hide');
        jQuery('#bing').addClass('spinner-show');
        //              jQuery('#bing').parent().find('span').remove();
      });
    }
  };
});

app.controller('c', function($scope) {

  $scope.$watch('src', function(newval, oldval) {
    jQuery('#bing').removeClass('spinner-show');
    jQuery('#bing').addClass('spinner-hide');
  })

});