Событие загрузки изображения для ng-src в AngularJS


106

У меня изображения выглядят как <img ng-src="dynamically inserted url"/>. Когда загружается одно изображение, мне нужно применить метод iScroll refresh (), чтобы сделать изображение прокручиваемым.

Как лучше всего узнать, когда изображение полностью загружено, чтобы выполнить обратный вызов?


1
Взгляните на $ http Response Interceptors . Вы можете использовать это, чтобы зарегистрировать обратный вызов, когда обещание разрешится
Марк Мейер,

Ответы:


185

Вот пример того, как вызвать загрузку изображения http://jsfiddle.net/2CsfZ/2/

Основная идея - создать директиву и добавить ее как атрибут в тег 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
как насчет обратного вызова при сбое?
Олег Белоусов

3
А как насчет прогрессивного изображения?
Nguyễn Đức Long

148

Я немного изменил это, чтобы $scopeможно было вызывать собственные методы:

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

Директива:

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

Надеюсь, кто-то сочтет это ОЧЕНЬ полезным. Спасибо @mikach

Тогда doThis()функция будет методом $ scope


3
Это правильно. Решение Микача не работало для меня, пока я не использовал $ apply (), как вы.
Джереми Тилль

Это лучший из предоставленных ответов. Полностью исключает необходимость загрузки JQUERY.
Ноэль Барон

Спасибо, что поставили точки с запятой, чтобы ворс не взорвался.
Ричард


9

@ Олег Тихонов: Только что обновил предыдущий код .. @ mikach Спасибо ..)

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
Может быть, лучше включить это в директиву imageonerror, чтобы вы могли выполнить другое действие.
Джон Кэтмелл,


4

Только что обновил предыдущий код ..

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

и директива ...

    .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

В основном это решение, которое я в итоге использовал.

$ apply () должен использоваться внешними источниками только при правильных обстоятельствах.

вместо того, чтобы использовать apply, я перебросил обновление области видимости в конец стека вызовов. Работает так же хорошо, как "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);
            });
        }
    };

}]);

что вы имеете в виду под " $apply()должно использоваться только внешними источниками"? я не слежу.
originalfafa

@genuinefafa Под «внешними источниками» он подразумевает не Angular код. Так, например, если вы используете общий прослушиватель событий JS для вызова кода, который изменяет $ scope, вам нужно будет использовать $ apply там. Но если это событие Angular или функция $ scope, вам не нужно $ apply, потому что цикл $ digest уже выполняется из методов Angular.
участник
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.