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

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

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

Ответ 1

Вот пример, как вызвать изображение onload 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 />

Ответ 2

Я немного изменил это, чтобы можно было вызвать пользовательские методы $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

@Олег Тихонов: Просто обновил предыдущий код.. @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');
        });
    }
  };
});

Ответ 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);
                });
            }
        };
    })

Ответ 5

Мой ответ:

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

Ответ 6

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

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

}]);