Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

background default image if ng-style image loaded is invalid url

I am adding background images to my div like this

ng-style="{'background-image' : 'url('+ myvariable.for.image +')'}">

where myvariable.for.image is a url like /examplesite/image/id

This works fine with one exception, if the image is not there it just doesnt do anything and my background looks too bla...If the image doesnt exist I want to be able to replace it with a default image.

But I cant seem to figure out how

like image 910
Asim Zaidi Avatar asked Jan 11 '14 00:01

Asim Zaidi


Video Answer


1 Answers

Instead of ngStyle I'd use a custom directive for this. Such as the following. This checks to see if an attribute is provided, if so it attempts to load that image. If it loads an image then we set the background image to it, otherwise we use a default image.

myApp.directive('bgImage', function () {
    return {
        link: function(scope, element, attr) {

            attr.$observe('bgImage', function() {           
              if (!attr.bgImage) {
                 // No attribute specified, so use default
                 element.css("background-image","url("+scope.defaultImage+")");
              } else {
                 var image = new Image();  
                 image.src = attr.bgImage;
                 image.onload = function() { 
                    //Image loaded- set the background image to it
                    element.css("background-image","url("+attr.bgImage+")");
                 };
                 image.onerror = function() {
                    //Image failed to load- use default
                    element.css("background-image","url("+scope.defaultImage+")");
                 };
             }
         });
      }
    };
});

Used like this:

 <div bg-image="{{person.src}}">

demo fiddle

like image 192
KayakDave Avatar answered Oct 19 '22 17:10

KayakDave