Подія завантажена зображенням для ng-src в AngularJS


106

У мене схожі зображення <img ng-src="dynamically inserted url"/>. Коли завантажується одне зображення, мені потрібно застосувати метод iScroll refresh (), щоб зробити зображення прокручуваним.

Який найкращий спосіб дізнатися, коли зображення завантажується повністю для запуску певного зворотного дзвінка?


1
Погляньте на $ http Перехоплювачі відповідей . Ви можете використовувати це для реєстрації зворотного дзвінка, коли обіцянка вирішиться
Марк Мейєр

Відповіді:


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
як щодо відмови виклику помилки?
Олег Білоусов

3
А як прогресивний образ?
Nguyễn Đứ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()функція буде методом діапазону $


3
Це правильно. Рішення Мікача не працювало для мене, поки я не використав $ apply (), як ви.
Джеремі Тілль

Це найкращий із наданих відповідей. Повністю виключає і необхідність будь-якого завантаження JQUERY.
Ноель Барон

Дякую за те, що ви наклали напівколонки, щоб волошки не вибухнули.
Річард

це дає мені цю помилку: code.angularjs.org/1.4.9/docs/error/$rootScope/…
Paulo Roberto Rosa

9

@ Олег Тихонов: Щойно оновив попередній код .. @ 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, я кинув оновлення сфери на кінець стека викликів. Працює так само добре, як "область. $ 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()слід використовувати лише зовнішні джерела»? я не стежу.
truefafa

@genuinefafa Що означає "зовнішні джерела", це невугольний код. Так, наприклад, якщо ви використовуєте загальний слухач подій JS, щоб зателефонувати в код, який змінює $ range, вам потрібно буде використовувати $ apply там. Але якщо це подія Angular або функція $ range, вам не потрібно $ застосовувати, оскільки цикл перебору $ вже працює від Angular методів.
tpartee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.