Poco tarde para la fiesta, aunque se me ocurrió una solución para más o menos el mismo problema en un sistema que estoy construyendo.
Sin embargo, mi idea era manejar CADA img
etiqueta de imagen a nivel mundial.
No quería tener que salpicar mis HTML
directivas innecesarias, como las err-src
que se muestran aquí. Muy a menudo, especialmente con imágenes dinámicas, no sabrá si falta hasta que sea demasiado tarde. Agregar directivas adicionales en caso de que falte una imagen me parece excesivo.
En cambio, extiendo la img
etiqueta existente , que, en realidad, de eso se tratan las directivas angulares.
Entonces, esto es lo que se me ocurrió.
Nota : Esto requiere que la biblioteca JQuery completa esté presente y no solo el JQlite Angular que se envía porque estamos usando.error()
Puedes verlo en acción en este Plunker
La directiva se ve más o menos así:
app.directive('img', function () {
return {
restrict: 'E',
link: function (scope, element, attrs) {
// show an image-missing image
element.error(function () {
var w = element.width();
var h = element.height();
// using 20 here because it seems even a missing image will have ~18px width
// after this error function has been called
if (w <= 20) { w = 100; }
if (h <= 20) { h = 100; }
var url = 'http://placehold.it/' + w + 'x' + h + '/cccccc/ffffff&text=Oh No!';
element.prop('src', url);
element.css('border', 'double 3px #cccccc');
});
}
}
});
Cuando se produce un error (que se debe a que la imagen no existe o es inalcanzable, etc.) capturamos y reaccionamos. También puede intentar obtener los tamaños de imagen, si estaban presentes en la imagen / estilo en primer lugar. Si no es así, configúrate por defecto.
Este ejemplo está usando placehold.it para que se muestre una imagen en su lugar.
Ahora CADA imagen, independientemente de su uso src
o se ng-src
ha cubierto en caso de que no se cargue nada ...