uploadfile tutorial files examples javascript angularjs angularjs-directive onload jqlite

javascript - tutorial - AngularJS-Evento "onload" de imagen



ng-file-upload tutorial (2)

Aquí hay una directiva reutilizable en el estilo de las directivas de manejo de eventos incorporados de 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 }); }); }); } }; }]);

Cuando se activa el evento de carga img, la expresión en el atributo sb-load se evalúa en el ámbito actual junto con el evento de carga, pasado como $ event. He aquí cómo usarlo:

HTML

<div ng-controller="MyCtrl"> <img sb-load="onImgLoad($event)"> </div>

JS

.controller("MyCtrl", function($scope){ // ... $scope.onImgLoad = function (event) { // ... }

Nota: "sb" es solo el prefijo que uso para mis directivas personalizadas.

He estado buscando una respuesta a una pregunta simple pero no trivial: ¿cuál es la forma correcta de detectar el evento de carga de imágenes en Angular solo con jqLite? Encontré esta pregunta , pero quiero una solución con las directivas.
Entonces, como dije, esto no me fue aceptado:

.controller("MyCtrl", function($scope){ // ... img.onload = function () { // ... }

porque está en el controlador, no en la directiva.


Ok, el método jqLite '' bind hace bien su trabajo. Dice así:

Estamos agregando el nombre de la directiva como atributo en nuestra etiqueta de img . En mi caso, después de cargar y dependiendo de sus dimensiones, la imagen tiene que cambiar su nombre de clase de "horizontal" a "vertical", por lo que el nombre de la directiva será "orientable":

<img ng-src="image_path.jpg" class="horizontal" orientable />

Y luego estamos creando una directiva simple como esta:

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

Ejemplo (gráficos explícitos!): http://jsfiddle.net/5nZYZ/63/