Angular2: Afficher l'image d'espace réservé si img src n'est pas valide
Objectif: Charger une image avec une source dynamique. Si aucune image n'est trouvée, puis de charger une image d'espace réservé à la place.
Cela devrait démontrer ce que je suis en train de faire, mais je ne sais pas comment de manière conditionnelle validImage selon que la première img src est valide.
<img *ngif="validImage" class="thumbnail-image" src="./app/assets/images/{{image.ID}}.jpg" alt="...">
<img *ngif="!validImage" class="thumbnail-image" src="./app/assets/images/placeholder.jpg" alt="...">
validImage devrait être vrai si la src="./app/assets/images/{{image.ID}}.jpg" renvoie une image. Sinon, il serait de retour fausses et seulement la deuxième balise img devrait montrer.
Il y a un travail évident de solutions de rechange comme le stockage d'une liste de toutes les sources d'image, mais je pense que il ya une meilleure façon d'accomplir ceci.
Des suggestions sur la meilleure façon de mettre en œuvre cette Angular2 serait grandement apprécié.
- Regarder dans onerror
Vous devez vous connecter pour publier un commentaire.
La meilleure façon de gérer rompu le lien d'une image est l'utilisation de la
onError
événement pour le<img>
tag:this.src
? il devrait fonctionner sans trop, mais ne fonctionne pas[src]="imagePath"
si vous définissez le chemin d'accès complet.Je suis tombé sur un besoin similaire. Je voulais par défaut à une 1X1 pixel transparent si une img url a la valeur null ou n'a pas retourné un message d'erreur (404, etc).
Balisage
onError()
aurait fait n'importe quoi dans ce cas? Elle retourne une chaîne de caractères...onError
partie doit être modifié pourthis.src = this.defaultImg;
Et quelque part dans votre classe de composant:
J'ai créé un composant personnalisé qui utilise un espace réservé d'image si l'image n'est toujours pas chargé ou si une erreur se produit lors du chargement d'elle:
img.composante.ts:
img.component.html:
Alors vous pouvez l'utiliser comme:
PS: j'ai vérifier au préalable si l'image est mise en cache pour éviter l'image de clignotant (normalement, quand un composant qui possède l'image à l'intérieur est re-rendus) entre l'espace réservé et de l'image (si elle est mise en cache, je montre l'image avant même le chargement du pavillon être défini à true). Vous pouvez décommenter le journal dans la
isCached
fonction pour voir si vos images sont mises en cache ou non.img
src
). Si le cache est différent pour la même image, il serait toujours revenirfalse
quandisCached()
est appelé. Vous pouvez faire l'essai de chargement d'une image dans unimg
balise et après appelnew Image()
passage de la mêmesrc
et de voir queisCached()
retournetrue
de façon synchrone (car il utilise le même cache). Vous pouvez aussi vérifier dans votre navigateur inspecteur pour voir les appels réseau.Image
utilise le cache du navigateur. À partir de la MDN web docs: LeImage()
constructeur crée un nouveauHTMLImageElement
instance. Il est fonctionnellement équivalent àdocument.createElement('img')
.my-img
élément et de le rendre à la règle css commemy-img.my-class img { ... }
. Si vous avez vraiment besoin d'inclure la classe dans leimg
élément, alors vous pouvez changer le composant pour avoir un@Input()
qui reçoit la classe et la passer à la 4img
éléments dans le modèle html (comme<img [class]="myInput" ... >
).Il y a un non-Angular2 façon par pur CSS:
Style Images Brisées
Mais veuillez noter que le navigateur paramètres de support dans l'article.
J'ai Juste fait :
Dans mon FICHIER HTML a écrit ce
J'ai appelé une fonction qui est dans mon composant.ts et de passer de l'objet wheres mon url en paramètre
Heres ma fonction , j'ai d'abord vérifier si l'objet url de l'image est différente de null si c'est vrai alors je retourne l'url de l'image d'autre-je retourner mon défaut "noFound" de l'image qui est dans mon appli actifs.
Espère que cela aide!
L'approche suivante fonctionne également si vous souhaitez gérer l'erreur en vous classe:
Dans votre modèle:
<img [src]='varWithPath' (error) ="onImgError($event)">
Dans votre classe:
onImgError(event) {
event.target.src = 'assets/path_to_your_placeholder_image.jpg';
}