Событие с загруженным изображением для 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);
});
}
};
}]);