Evento caricato immagine in per ng-src in AngularJS


106

Ho delle immagini che sembrano <img ng-src="dynamically inserted url"/>. Quando viene caricata una singola immagine, devo applicare il metodo iScroll refresh () in modo da rendere l'immagine scorrevole.

Qual è il modo migliore per sapere quando un'immagine è completamente caricata per eseguire una richiamata?


1
Dai un'occhiata a $ http Response Interceptors . Potresti usarlo per registrare una richiamata quando la promessa si risolve
Mark Meyer

Risposte:


185

Ecco un esempio su come chiamare l'immagine onload http://jsfiddle.net/2CsfZ/2/

L'idea di base è creare una direttiva e aggiungerla come attributo al 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
che dire di una richiamata fallita?
Oleg Belousov

3
E l'immagine progressiva?
Nguyễn Đức Long,

148

L'ho modificato un po 'in modo che i $scopemetodi personalizzati possano essere chiamati:

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

La direttiva:

.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);
                });
            }
        };
    })

Spero che qualcuno lo trovi MOLTO utile. Grazie @mikach

La doThis()funzione sarebbe quindi un metodo $ scope


3
È corretto. La soluzione di Mikach non ha funzionato per me fino a quando non ho usato $ apply () come hai fatto tu.
Jeremy Thille

Questa è la migliore delle risposte fornite. Elimina totalmente anche la necessità di qualsiasi caricamento JQUERY.
Noel Baron

Grazie per aver messo i punti e virgola in modo che i pelucchi non esplodano.
richard


9

@ Oleg Tikhonov: ho appena aggiornato il codice precedente .. @ mikach Grazie ..)

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');
        });
    }
  };
});

1
Potrebbe essere meglio averlo in una direttiva "imageonerror" in modo da poter eseguire un'azione diversa.
Jon Catmull

5

La mia risposta:

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

esattamente quello che stavo cercando!
Zohab Ali

4

Appena aggiornato il codice precedente ..

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

e direttiva ...

    .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

Fondamentalmente questa è la soluzione che ho finito per usare.

$ apply () dovrebbe essere usato solo da fonti esterne nelle giuste circostanze.

invece di usare apply, ho lanciato l'aggiornamento dell'ambito alla fine dello stack di chiamate. Funziona bene come "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);
            });
        }
    };

}]);

cosa intendi con " $apply()dovrebbe essere utilizzato solo da fonti esterne"? non sto seguendo.
genuinefafa

@genuinefafa Ciò che intende per "fonti esterne" è codice non angolare. Quindi, ad esempio, se stai utilizzando un listener di eventi JS generico per chiamare un codice che cambia $ scope, dovresti usare $ apply lì. Ma se si tratta di un evento Angular o di una funzione $ scope non è necessario $ apply perché il ciclo $ digest è già in esecuzione dai metodi Angular.
partecipazione il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.