Sự kiện tải hình ảnh cho ng-src trong AngularJS


106

Tôi có những hình ảnh trông giống như <img ng-src="dynamically inserted url"/>. Khi một hình ảnh được tải, tôi cần áp dụng phương thức iScroll refresh () để làm cho hình ảnh có thể cuộn được.

Cách tốt nhất để biết khi nào một hình ảnh được tải đầy đủ để chạy một số lệnh gọi lại là gì?


1
Xem qua $ http Response Interceptors . Bạn có thể sử dụng để đăng ký một callback khi giải quyết lời hứa
Đánh dấu Meyer

Câu trả lời:


185

Đây là một ví dụ về cách gọi hình ảnh onload http://jsfiddle.net/2CsfZ/2/

Ý tưởng cơ bản là tạo một chỉ thị và thêm nó làm thuộc tính cho thẻ 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
những gì về một cuộc gọi lại thất bại?
Oleg Belousov

3
Còn về hình ảnh tiến bộ?
Nguyễn Đức Long

148

Tôi đã sửa đổi điều này một chút để các $scopephương thức tùy chỉnh có thể được gọi:

<img ng-src="{{src}}" imageonload="doThis()" />

Chỉ thị:

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

Hy vọng ai đó thấy nó RẤT hữu ích. Cảm ơn @mikach

Khi đó, doThis()hàm sẽ là một phương thức $ scope


3
Đúng rồi. Giải pháp của Mikach không hiệu quả với tôi cho đến khi tôi sử dụng $ apply () như bạn đã làm.
Jeremy Thille,

Đây là câu trả lời tốt nhất được cung cấp. Loại bỏ hoàn toàn nhu cầu tải JQUERY.
Noel Baron

Cảm ơn bạn đã đặt dấu chấm phẩy để xơ vải không phát nổ.
richard

điều này mang lại cho tôi lỗi này: code.angularjs.org/1.4.9/docs/error/$rootScope/…
Paulo Roberto Rosa

9

@ Oleg Tikhonov: Vừa cập nhật mã trước .. @ mikach Cảm ơn ..)

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
Có thể tốt hơn nếu có điều đó trong chỉ thị 'imageonerror' để bạn có thể thực hiện một hành động khác.
Jon Catmull,

5

Câu trả lời của tôi:

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

Chính xác những gì tôi đang tìm kiếm!
Zohab Ali

4

Vừa cập nhật mã trước ..

<img ng-src="{{urlImg}}" imageonload="myOnLoadImagenFunction">

và chỉ thị ...

    .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

Về cơ bản, đây là giải pháp tôi đã sử dụng.

$ apply () chỉ nên được sử dụng bởi các nguồn bên ngoài trong những trường hợp thích hợp.

thay vì sử dụng áp dụng, tôi đã ném cập nhật phạm vi vào cuối ngăn xếp cuộc gọi. Hoạt động tốt như "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);
            });
        }
    };

}]);

ý bạn là " $apply()chỉ nên được sử dụng bởi các nguồn bên ngoài"? tôi không theo dõi.
hãngfafa

@genuinefafa Ý của anh ấy bằng 'nguồn bên ngoài' là mã không phải Angular. Vì vậy, ví dụ: nếu bạn đang sử dụng trình xử lý sự kiện JS chung để gọi vào mã thay đổi phạm vi $, bạn sẽ cần sử dụng $ apply ở đó. Nhưng nếu đó là một sự kiện Angular hoặc một hàm $ scope, bạn không cần phải áp dụng $ vì chu trình thông báo $ đã chạy từ các phương thức Angular.
tpartee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.