我的图片看起来像<img ng-src="dynamically inserted url"/>
。加载单个图像时,我需要应用iScroll refresh()方法,以便使图像可滚动。
了解图像何时完全加载以运行某些回调的最佳方法是什么?
答案 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);
});
}
};
}]);