En angularjs tiene la etiqueta ng-src que tiene el propósito de que no recibirá un error por una URL no válida antes de que angularjs pueda evaluar las variables ubicadas entre {{
y }}
.
El problema es que uso bastantes DIV con un background-image
conjunto en una url. Hago esto debido a la excelente propiedad CSS3 background-size
que recorta la imagen al tamaño exacto del DIV.
El único problema es que recibo muchos errores por la misma razón por la que crearon una etiqueta ng-src: tengo algunas variables en la URL y el navegador cree que la imagen no existe.
Me doy cuenta de que existe la posibilidad de escribir un crudo {{"style='background-image:url(myVariableUrl)'"}}
, pero esto parece "sucio".
He buscado mucho y no puedo encontrar la forma correcta de hacerlo. Mi aplicación se está volviendo un desastre debido a todos estos errores.
Esta funciona para mí
fuente
imgURL
no establecida yimgURL
vuelve a intentarlo cuando se configura.La respuesta anterior no admite interpolación observable (y me costó mucho tiempo tratar de depurar). El enlace jsFiddle en el comentario de @BrandonTilley fue la respuesta que funcionó para mí, que volveré a publicar aquí para su preservación:
Ejemplo usando controlador y plantilla
Controlador :
Modelo :
Usar en plantilla así:
o así:
fuente
También es posible hacer algo como esto con
ng-style
:que no intentaría obtener una imagen no existente.
fuente
Similar a la respuesta de hooblei, solo con interpolación:
fuente
<span ng-style="{'background-image': 'url(/styles/images/profile.png)'}" style="background-image: url("");"></span>
. El enfoque @hooblei funcionó.solo es cuestión de gustos, pero si prefiere acceder a la variable o función directamente de esta manera:
en lugar de interpolar así:
entonces puedes definir la directiva un poco diferente con
scope.$watch
lo que harás$parse
en el atributoHay más antecedentes sobre esto aquí: AngularJS: diferencia entre los métodos $ observe y $ watch
fuente
@jaime tu respuesta está bien. Pero si su página tiene el $ http.get, entonces debe usar ng-if
en la fábrica
en el área del controlador
y la vista si usa el ng-if como se muestra a continuación, obtendrá la imagen por interpolación; de lo contrario, no puede obtener la imagen porque la directiva obtiene el valor antes de la solicitud HTTP.
fuente
He encontrado con 1.5 componentes que abstraen el estilo del DOM para que funcione mejor en mi situación asíncrona.
Ejemplo:
Y en el controlador, algo le gusta esto:
fuente
Como mencionó
ng-src
y parece que desea que la página termine de renderizarse antes de cargar su imagen, puede modificar la respuesta de jaime para ejecutar la directiva nativa después de que el navegador finalice el renderizado.Esta publicación de blog explica esto bastante bien; en esencia, se inserta el
$timeout
envoltorio parawindow.setTimeout
antes de la función de devolución de llamada que hacer esas modificaciones en el CSS.fuente