AngularJS中ng-src的图像加载事件

时间:2013-07-26 14:43:54

标签: javascript html angularjs

我的图片看起来像<img ng-src="dynamically inserted url"/>。加载单个图像时,我需要应用iScroll refresh()方法,以便使图像可滚动。

了解图像何时完全加载以运行某些回调的最佳方法是什么?

6 个答案:

答案 0 :(得分:184)

以下是如何调用image 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 />

答案 1 :(得分:142)

我对此进行了一些修改,以便可以调用自定义$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方法

答案 2 :(得分:9)

@ Oleg Tikhonov:刚刚更新了以前的代码.. @ 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');
        });
    }
  };
});

答案 3 :(得分: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);
                });
            }
        };
    })

答案 4 :(得分:4)

我的回答:

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

答案 5 :(得分:0)

基本上这是我最终使用的解决方案。

$ apply()只应在适当的情况下由外部来源使用。

而不是使用apply,我将范围更新抛出到调用堆栈的末尾。与&#34;范围一样好。$ apply(attrs.imageonload)(true);&#34;。

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

}]);