AngularJS - изображение "onload" событие
Я искал ответ на простой, но не тривиальный вопрос: что такое правильный способ захватить изображение onload
событие в Angular только с помощью jqLite? Я нашел этот вопрос, но мне нужно некоторое решение с директивами.
Как я уже сказал, это не принято для меня:
.controller("MyCtrl", function($scope){
// ...
img.onload = function () {
// ...
}
поскольку он находится в контроллере, а не в директиве.
Ответы
Ответ 1
Здесь приведена директива re-usable в стиле 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 выражение в атрибуте sb-load оценивается в текущей области вместе с событием загрузки, переданным как $event. Вот как его использовать:
HTML
<div ng-controller="MyCtrl">
<img sb-load="onImgLoad($event)">
</div>
JS
.controller("MyCtrl", function($scope){
// ...
$scope.onImgLoad = function (event) {
// ...
}
Примечание: "sb" - это только префикс, который я использую для своих пользовательских директив.
Ответ 2
Хорошо, jqLite 'bind
метод хорошо выполняет свою работу. Это происходит следующим образом:
Мы добавляем директивное имя в качестве атрибута в наш тег img
. В моем случае после загрузки и в зависимости от его размеров изображение должно изменить свое имя класса от "горизонтального" до "вертикального", поэтому директивное имя будет "ориентируемым":
<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/