AngularのみでjqLiteで画像 'onload
イベントをキャッチする正しい方法は何ですか?私は見つけました- この質問 ですが、ディレクティブを使用した解決策が必要です。
だから私が言ったように、これは私には受け入れられません:
.controller("MyCtrl", function($scope){
// ...
img.onload = function () {
// ...
}
ディレクティブではなく、コントローラー内にあるためです。
次に、angularの組み込みイベント処理ディレクティブのスタイルで再利用可能なディレクティブを示します。
angular.module('sbLoad', [])
.directive('sbLoad', ['$parse', function ($parse) {
return {
restrict: 'A',
link: function (scope, elem, attrs) {
var fn = $parse(attrs.sbLoad);
elem.on('load', function (event) {
scope.$apply(function() {
fn(scope, { $event: event });
});
});
}
};
}]);
Img loadイベントが発生すると、sb-load属性の式が、$ eventとして渡されるloadイベントとともに現在のスコープで評価されます。使用方法は次のとおりです。
[〜#〜] html [〜#〜]
<div ng-controller="MyCtrl">
<img sb-load="onImgLoad($event)">
</div>
[〜#〜] js [〜#〜]
.controller("MyCtrl", function($scope){
// ...
$scope.onImgLoad = function (event) {
// ...
}
注:「sb」は、カスタムディレクティブに使用するプレフィックスです。
OK、jqLite ' bind
メソッドはその仕事をうまくやっています。こんなふうになります:
img
タグの属性としてディレクティブの名前を追加しています。私の場合、ロード後、その寸法に応じて、画像はクラス名を「horizontal」から「vertical」に変更する必要があるため、ディレクティブの名前は「orientable」になります。
<img ng-src="image_path.jpg" class="horizontal" orientable />
そして、次のような単純なディレクティブを作成しています。
var app = angular.module('myApp',[]);
app.directive('orientable', function () {
return {
link: function(scope, element, attrs) {
element.bind("load" , function(e){
// success, "onload" catched
// now we can do specific stuff:
if(this.naturalHeight > this.naturalWidth){
this.className = "vertical";
}
});
}
}
});
例(明示的なグラフィック!): http://jsfiddle.net/5nZYZ/63/
AngularJS V1.7.ng-on-xxx
ディレクティブを追加しました:
<div ng-controller="MyCtrl">
<img ng-on-load="onImgLoad($event)">
</div>
AngularJSは、ngClick
などの多くのイベントに特定のディレクティブを提供するため、ほとんどの場合、ngOn
を使用する必要はありません。ただし、AngularJSはすべてのイベントをサポートしているわけではなく、新しいイベントが後のDOM標準で導入される可能性があります。
詳細については、「 AngularJS ng-on Directive API Reference 」を参照してください。
angular js。既存のプロジェクトにng-loadを追加します。
angular js のng-loadをダウンロード
npm i angular-ng-load
以下はiframeの例です。一度読み込まれるとtestCallbackFunctionがコントローラーで呼び出されます
[〜#〜] example [〜#〜]
JS
// include the `ngLoad` module
var app = angular.module('myApp', ['ngLoad']);
app.controller('myCtrl', function($scope) {
$scope.testCallbackFunction = function() {
//TODO : Things to do once Element is loaded
};
});
HTML
<div ng-app='myApp' ng-controller='myCtrl'>
<iframe src="test.html" ng-load callback="testCallbackFunction()">
</div>