2013-07-26 4 views
97

Ich habe Bilder wie <img ng-src="dynamically inserted url"/> aussehen. Wenn ein einzelnes Bild geladen wird, muss ich die iScroll refresh() -Methode anwenden, um das Bild scrollbar zu machen.Bild geladen Ereignis in für ng-src in AngularJS

Was ist der beste Weg zu wissen, wann ein Bild vollständig geladen ist, um einen Callback auszuführen? Hier

+1

Werfen Sie einen Blick auf [$ HTTP-Response-Interceptor] (http://docs.angularjs.org/api/ng.$http). Sie könnten dies verwenden, um einen Rückruf zu registrieren, wenn das Versprechen –

Antwort

178

ist ein Beispiel, wie Bild onload nennen http://jsfiddle.net/2CsfZ/2/

Grundidee ist es, eine Richtlinie erstellen und als Attribut hinzufügen Tag img.

JS:

app.directive('imageonload', function() { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      element.bind('load', function() { 
       alert('image is loaded'); 
      }); 
      element.bind('error', function(){ 
       alert('image could not be loaded'); 
      }); 
     } 
    }; 
}); 

HTML:

<img ng-src="{{src}}" imageonload /> 
+1

löst, was ist mit einem Fehlerrückruf? –

+7

Du meinst element.bind ('Fehler', Rückruf)? – mikach

+2

Was ist mit Cache? –

135

ich dieses ein wenig verändert, so dass benutzerdefinierte $scope Methoden aufgerufen werden:

<img ng-src="{{src}}" imageonload="doThis()" /> 

Die Richtlinie:

.directive('imageonload', function() { 
     return { 
      restrict: 'A', 
      link: function(scope, element, attrs) { 
       element.bind('load', function() { 
        //call the function that was passed 
        scope.$apply(attrs.imageonload); 
       }); 
      } 
     }; 
    }) 

Hoffe jemand findet es sehr nützlich. @mikach Dank

Die doThis() Funktion dann ein $ scope Methode

+2

Das ist richtig. Mikachs Lösung hat nicht funktioniert, bis ich $ apply() benutzt habe. –

+0

Dies ist die beste der Antworten. JQuery muss nicht mehr geladen werden. –

+0

Vielen Dank für das Setzen von Semikolon, damit Flusen nicht explodieren. – richard

9

@ Oleg Tikhonov wäre: einfach den vorherigen Code aktualisiert .. @ mikach Dank ..)

app.directive('imageonload', function() { 
    return { 
    restrict: 'A', 
    link: function(scope, element, attrs) { 
     element.bind('load', function() { 
      alert('image is loaded'); 
     }); 
     element.bind('error', function(){ 
      alert('image could not be loaded'); 
     }); 
    } 
    }; 
}); 
+0

Es könnte besser sein, das in einer 'imageonerror'-Direktive zu haben, damit Sie eine andere Aktion ausführen können. –

4

aktualisiert einfach die vorherigen Code ..

<img ng-src="{{urlImg}}" imageonload="myOnLoadImagenFunction"> 

und Richtlinie ...

.directive('imageonload', function() { 
     return { 
      restrict: 'A', 
      link: function(scope, element, attrs) { 
       element.bind('load', function() { 
        scope.$apply(attrs.imageonload)(true); 
       }); 
       element.bind('error', function(){ 
        scope.$apply(attrs.imageonload)(false); 
       }); 
      } 
     }; 
    }) 
0

Im Grunde ist dies die Lösung, die ich verwendet habe.

$ apply() sollte nur von externen Quellen unter den richtigen Umständen verwendet werden.

eher dann mit anwenden, habe ich den Bereich Aktualisierung bis zum Ende des Aufrufs Stack geworfen. Funktioniert so gut wie "scope. $ Apply (attrs.imageonload) (true);".

window.app.directive("onImageload", ["$timeout", function($timeout) { 

    function timeOut(value, scope) { 
     $timeout(function() { 
      scope.imageLoaded = value; 
     }); 
    } 

    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      element.bind('load', function() { 
       timeOut(true, scope); 
      }).bind('error', function() { 
       timeOut(false, scope); 
      }); 
     } 
    }; 

}]); 
+0

Was Sie mit "$ apply()" meinen, sollte nur von externen Quellen verwendet werden "? Ich folge nicht. – genuinefafa

+0

@genuinefafa Was er unter "externe Quellen" versteht, ist nicht-eckiger Code. Wenn Sie zum Beispiel einen generischen JS-Ereignis-Listener zum Aufrufen von Code verwenden, der $ scope ändert, müssen Sie $ apply dort verwenden. Wenn es sich um ein Angular-Ereignis oder eine $ Scope-Funktion handelt, brauchen Sie $ apply nicht, da der $ digest-Zyklus bereits von Angular-Methoden aus ausgeführt wird. – tpartee

1

Meine Antwort:

var img = new Image(); 
var imgUrl = "path_to_image.jpg"; 
img.src = imgUrl; 
img.onload = function() { 
     $scope.pic = img.src; 
} 
Verwandte Themen