La aplicación que estoy creando requiere que mi usuario establezca 4 piezas de información antes de que esta imagen tenga la posibilidad de cargarse. Esta imagen es la pieza central de la aplicación, por lo que el enlace de imagen rota hace que parezca que todo está borrado. Me gustaría que otra imagen tome su lugar en un 404.
¿Algunas ideas? Me gustaría evitar escribir una directiva personalizada para esto.
Me sorprendió no poder encontrar una pregunta similar, ¡especialmente cuando la primera pregunta en los documentos es la misma!
angularjs
angularjs-directive
will_hardin
fuente
fuente
Respuestas:
Es una directiva bastante simple observar un error al cargar una imagen y reemplazar el src. (Plunker)
HTML:
Javascript:
Si desea mostrar la imagen de error cuando ngSrc está en blanco, puede agregar esto (Plunker) :
El problema es que ngSrc no actualiza el atributo src si el valor está en blanco.
fuente
src
atributo de laerr-src
imagen: plnkr.co/edit/b05WtghBOHkxKdttZ8q5Poco 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 laserr-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í:
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 seng-src
ha cubierto en caso de que no se cargue nada ...fuente
Para expandir la solución de Jason para detectar ambos casos de un error de carga o una cadena de fuente vacía, simplemente podemos agregar un reloj.
HTML:
Javascript:
fuente
ng-if
la plantilla (la cadena src vacío)attrs.$observe('ngSrc', function(value) {...});
, eso es lo que ngSrc usa internamente en lugar de $ watchen HTML:
fuente
Si la imagen es 404 o la imagen está nula vacía, no hay necesidad de directivas, simplemente puede usar el filtro ng-src como este :)
fuente
Uso algo como esto, pero supone que team.logo es válido. Se fuerza por defecto si "team.logo" no está configurado o está vacío.
fuente
No necesitas angular para eso, ni siquiera CSS o JS. Si lo desea, puede envolver esta respuesta (vinculada) en una directiva simple para que sea más simple, como o algo así, pero es un proceso bastante simple ... simplemente envuélvala en una etiqueta de objeto ...
Cómo ocultar el icono roto de la imagen usando solo CSS / HTML (sin js)
fuente
¿Hay alguna razón específica por la que no pueda declarar la imagen alternativa en su código?
Según tengo entendido, tiene dos casos posibles para su fuente de imagen:
Creo que esto debería ser manejado por su aplicación: si la URL correcta no se puede determinar actualmente, en su lugar, pase una URL de imagen de carga / reserva / marcador de posición.
El razonamiento es que nunca tiene una imagen 'faltante', porque ha declarado explícitamente la URL correcta para mostrar en cualquier momento.
fuente
Le sugiero que le guste usar la directiva 'declaración de if' de Angular UI Utils para resolver su problema, como se encuentra en http://angular-ui.github.io/ . Lo acabo de usar para hacer exactamente lo mismo.
Esto no se ha probado, pero podría hacer algo como:
Código del controlador:
(o más simple)
HTML en la vista:
<img ui-if="showImage()" ng-src="images/{{data.value}}.jpg" />
O incluso más simple, podría usar una propiedad de alcance:
Código del controlador:
HTML en la vista:
<img ui-if="showImage" ng-src="images/{{data.value}}.jpg" />
Para una imagen de marcador de posición, simplemente agregue otra
<img>
etiqueta similar, pero anteponga suui-if
parámetro con un signo de exclamación (!
) y haga que ngSrc tenga la ruta a la imagen de marcador de posición, o simplemente use unasrc
etiqueta según el código HTML normal.p.ej.
<img ui-if="!showImage" src="images/placeholder.jpg" />
Obviamente, todos los ejemplos de código anteriores suponen que cada valor1, valor2, valor3 y valor4 equivaldrán a
null
/false
cuando cada una de sus 4 piezas de información esté incompleta (y, por lo tanto, también a un valor booleano detrue
cuando estén completas).PD. El proyecto AngularUI se ha dividido recientemente en subproyectos, y la documentación para
ui-if
parece estar ausente actualmente (aunque probablemente esté en el paquete). Sin embargo, es bastante sencillo de usar como puede ver, y he registrado un 'problema' de Github en el proyecto Angular UI para señalarlo también al equipo.ACTUALIZACIÓN: 'ui-if' falta en el proyecto AngularUI porque se ha integrado en el código central de AngularJS. Sin embargo, solo a partir de v1.1.x, que actualmente está marcado como 'inestable'.
fuente
ng-if
lo hice en el núcleo por cierto (a partir de 1.1.5 si no me equivoco).Aquí hay una solución que se me ocurrió usando JavaScript nativo. Estoy comprobando si la imagen está rota y luego agrego una clase a la imagen por si acaso y estoy cambiando la fuente.
Recibí parte de mi respuesta de una respuesta de Quora http://www.quora.com/How-do-I-use-JavaScript-to-find-if-an-image-is-broken
fuente
Se me ocurrió mi propia solución. Reemplaza la imagen tanto si src como ngSrc está vacío, y si img devuelve 404.
(tenedor de la solución @Darren)
fuente
Esto permitirá que solo se repita dos veces, para verificar si ng-src no existe; de lo contrario, use err-src, esto evita que el bucle continúe.
fuente