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


Answers:


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
失败回调怎么办?
Oleg Belousov 2014年

3
渐进式图像呢?
阮Đức龙

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()之前,Mikach的解决方案对我不起作用。
杰里米·锡耶

这是所提供的最佳答案。完全不需要任何JQUERY加载。
Noel Baron

谢谢您使用分号,这样皮棉不会爆炸。
理查德


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

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()仅应由外部来源使用”?我没有关注。
authenticfafa

@genuinefafa他所说的“外部资源”是非角度代码。因此,例如,如果您使用通用的JS事件监听器来调用更改$ scope的代码,则需要在其中使用$ apply。但是,如果它是Angular事件或$ scope函数,则不需要$ apply,因为$ digest循环已经在Angular方法中运行。
tpartee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.