AngularJSのng-srcの画像読み込みイベント


106

のような画像があります<img ng-src="dynamically inserted url"/>。単一の画像がロードされると、iScroll refresh()メソッドを適用して、画像をスクロール可能にする必要があります。

コールバックを実行するためにイメージが完全に読み込まれたことを知る最良の方法は何ですか?


1
$ http Response Interceptorsを見てください。これを使用して、約束が解決したときにコールバックを登録できます
Mark Meyer

回答:


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

3
プログレッシブ画像はどうですか?
グエンĐứ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()場合、関数は$ scopeメソッドになります


3
そのとおりです。Mikachのソリューションは、$ apply()を使用するまで機能しませんでした。
Jeremy Thille、2015年

これは、提供された回答のうち最良のものです。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 2015年

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ではなく、スコープの更新を呼び出しスタックの最後にスローしました。「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()外部ソースのみが使用すべき」とはどういう意味ですか?フォローしていません。
本物のファファ2016

@genuinefafa彼が「外部ソース」とは、非角度コードです。したがって、たとえば、汎用JSイベントリスナーを使用して$ scopeを変更するコードを呼び出す場合は、そこで$ applyを使用する必要があります。ただし、Angularイベントまたは$ scope関数の場合、$ digestサイクルは既にAngularメソッドから実行されているため、$ applyは必要ありません。
tpartee 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.