AngularJS의 ng-src에 대한 이미지로드 이벤트


106

나는 같은 이미지가 있습니다 <img ng-src="dynamically inserted url"/>. 단일 이미지를로드 할 때 이미지를 스크롤 할 수 있도록 iScroll refresh () 메서드를 적용해야합니다.

콜백을 실행하기 위해 이미지가 완전히로드 된시기를 아는 가장 좋은 방법은 무엇입니까?


1
$ http Response Interceptors를 살펴보십시오 . 당신은 콜백을 등록하려면이 옵션을 사용할 수있을 때 약속의 결의
마크 마이어

답변:


185

다음은 이미지 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
실패 콜백은 어떻습니까?
Oleg Belousov 2014

3
프로그레시브 이미지는 어떻습니까?
Nguyễn Đức Long

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
맞습니다. Mikach의 솔루션은 $ apply ()를 사용하기 전까지는 작동하지 않았습니다.
Jeremy Thille

이것은 제공된 답변 중 최고입니다. 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'지시문에 포함하는 것이 더 나을 수 있습니다.
Jon Catmull

5

내 대답 :

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

정확히 내가 찾던 것!
Zohab Ali

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 ()는 적절한 상황에서 외부 소스에 의해서만 사용되어야합니다.

적용을 사용하는 대신 호출 스택의 끝까지 범위 업데이트를 던졌습니다. "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()외부 소스에서만 사용해야 함"이란 무엇을 의미 합니까? 나는 따르지 않는다.
genuinefafa

@genuinefafa 그가 의미하는 '외부 소스'는 각도가 아닌 코드입니다. 예를 들어 일반 JS 이벤트 리스너를 사용하여 $ scope를 변경하는 코드를 호출하는 경우 $ apply를 사용해야합니다. 그러나 Angular 이벤트 또는 $ scope 함수 인 경우 $ digest주기가 이미 Angular 메서드에서 실행 중이므로 $ apply가 필요하지 않습니다.
tpartee aug
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.