Dans angularjs, vous avez la balise ng-src qui a pour but de ne pas recevoir d'erreur pour une URL invalide avant qu'angularjs ne puisse évaluer les variables placées entre {{
et }}
.
Le problème est que j'utilise pas mal de DIV avec un background-image
ensemble à une URL. Je fais cela en raison de l'excellente propriété CSS3 background-size
qui recadre l'image à la taille exacte du DIV.
Le seul problème est que je reçois beaucoup d'erreurs pour la même raison pour laquelle ils ont créé une balise ng-src: j'ai des variables dans l'url et le navigateur pense que l'image n'existe pas.
Je me rends compte qu'il y a une possibilité d'écrire un brut {{"style='background-image:url(myVariableUrl)'"}}
, mais cela semble «sale».
J'ai beaucoup cherché et je ne trouve pas la bonne façon de faire. Mon application devient un désordre à cause de toutes ces erreurs.
Celui-ci fonctionne pour moi
la source
imgURL
non défini et réessaye une foisimgURL
défini.La réponse ci-dessus ne prend pas en charge l'interpolation observable (et m'a coûté beaucoup de temps à essayer de déboguer). Le lien jsFiddle dans le commentaire @BrandonTilley était la réponse qui a fonctionné pour moi, que je re-posterai ici pour la préservation:
Exemple utilisant un contrôleur et un modèle
Manette :
Modèle :
Utilisez dans le modèle comme ceci:
ou comme ça:
la source
Il est également possible de faire quelque chose comme ça avec
ng-style
:qui n'essaierait pas de récupérer une image inexistante.
la source
Similaire à la réponse de hooblei, juste avec interpolation:
la source
<span ng-style="{'background-image': 'url(/styles/images/profile.png)'}" style="background-image: url("");"></span>
. L'approche @hooblei a fonctionné.juste une question de goût mais si vous préférez accéder à la variable ou à la fonction directement comme ceci:
au lieu d'interpoler comme ceci:
alors vous pouvez définir la directive un peu différemment avec
scope.$watch
ce qui fera$parse
sur l'attributil y a plus de détails à ce sujet ici: AngularJS: Différence entre les méthodes $ observe et $ watch
la source
@jaime votre réponse est très bien. Mais si votre page a le $ http.get, vous devez utiliser ng-if
dans l'usine
dans la zone contrôleur
et la vue si vous utilisez le ng-if comme ci-dessous, vous obtiendrez l'image par interpolation sinon, vous ne pouvez pas obtenir l'image car la directive obtient la valeur avant la requête HTTP.
la source
J'ai trouvé avec 1.5 composants qui résumaient le style du DOM pour fonctionner le mieux dans ma situation asynchrone.
Exemple:
Et dans le contrôleur, quelque chose comme ça:
la source
Puisque vous l'avez mentionné
ng-src
et qu'il semble que vous vouliez que la page finisse le rendu avant de charger votre image, vous pouvez modifier la réponse de jaime pour exécuter la directive native une fois le rendu du navigateur terminé.Ce billet de blog explique assez bien cela; essentiellement, vous insérez l'
$timeout
enveloppe pourwindow.setTimeout
avant que la fonction de rappel dans laquelle vous faites ces modifications au CSS.la source