O aplicativo que estou construindo exige que meu usuário defina 4 informações antes que esta imagem possa ser carregada. Esta imagem é a peça central do aplicativo, portanto, o link quebrado da imagem faz com que pareça que a coisa toda está funcionando. Gostaria de ter outra imagem em seu lugar no 404.
Alguma ideia? Eu gostaria de evitar escrever uma diretiva personalizada para isso.
Fiquei surpreso por não encontrar uma pergunta semelhante, especialmente quando a primeira pergunta nos documentos é a mesma!
angularjs
angularjs-directive
will_hardin
fonte
fonte
Respostas:
É uma diretiva bastante simples observar um erro ao carregar uma imagem e substituir o src. (Plunker)
Html:
Javascript:
Se você deseja exibir a imagem de erro quando o ngSrc estiver em branco, adicione-o (Plunker) :
O problema é que o ngSrc não atualiza o atributo src se o valor estiver em branco.
fonte
src
atributo para aerr-src
imagem: plnkr.co/edit/b05WtghBOHkxKdttZ8q5Um pouco tarde para a festa, embora eu tenha encontrado uma solução para mais ou menos o mesmo problema em um sistema que estou construindo.
Minha idéia, porém, era lidar com TODAS as
img
tags de imagem globalmente.Eu não queria ter que apimentar minhas
HTML
diretrizes desnecessárias, comoerr-src
as mostradas aqui. Frequentemente, especialmente com imagens dinâmicas, você não saberá se está faltando até que seja tarde demais. Adicionar diretivas extras à chance de uma imagem estar faltando parece um exagero para mim.Em vez disso, estendo a
img
tag existente - que é, na verdade, o que são as diretivas Angular.Então - é isso que eu criei.
Nota : Isso requer que a biblioteca JQuery completa esteja presente e não apenas os JQlite Angular enviados porque estamos usando
.error()
Você pode vê-lo em ação neste Plunker
A diretiva é mais ou menos assim:
Quando ocorre um erro (o que ocorre porque a imagem não existe ou é inacessível etc.), capturamos e reagimos. Você pode tentar obter os tamanhos de imagem também - se eles estivessem presentes na imagem / estilo em primeiro lugar. Caso contrário, defina-se como padrão.
Este exemplo está usando placehold.it para que uma imagem seja exibida.
Agora, TODAS as imagens, independentemente do uso
src
oung-src
se cobrem para o caso de nada carregar ...fonte
Para expandir a solução Jason para capturar os dois casos de erro de carregamento ou de uma sequência de código-fonte vazia, podemos apenas adicionar um relógio.
Html:
Javascript:
fonte
ng-if
no modelo (a string src vazio)attrs.$observe('ngSrc', function(value) {...});
, é isso que o ngSrc usa internamente em vez de $ watch #em HTML:
fonte
Se a imagem for 404 ou a imagem for nula vazia, seja o que for, não há necessidade de diretivas, você pode simplesmente usar o filtro ng-src como este :)
fonte
Eu uso algo assim, mas assume que team.logo é válido. Força o padrão se "team.logo" não estiver definido ou estiver vazio.
fonte
Você não precisa angular para isso, nem CSS ou JS. Se desejar, você pode agrupar esta resposta (vinculada) em uma diretiva simples para torná-la mais simples, algo assim, mas é um processo bastante simples ... basta envolvê-la em uma tag de objeto ...
Como ocultar o ícone de imagem quebrada usando apenas CSS / HTML (sem js)
fonte
Existe um motivo específico para você não poder declarar a imagem de fallback no seu código?
Pelo que entendi, você tem dois casos possíveis para sua fonte de imagem:
Acho que isso deve ser tratado pelo seu aplicativo. Se o URL correto não puder ser determinado no momento, transmita um URL de imagem de carregamento / fallback / espaço reservado.
O raciocínio é que você nunca tem uma imagem 'ausente', porque declarou explicitamente o URL correto a ser exibido a qualquer momento.
fonte
Sugiro que você queira usar a diretiva 'if statement' do Angular UI Utils para resolver seu problema, conforme encontrado em http://angular-ui.github.io/ . Acabei de usá-lo para fazer exatamente a mesma coisa.
Isso não foi testado, mas você pode fazer algo como:
Código do controlador:
(ou mais simples)
HTML no modo de exibição:
<img ui-if="showImage()" ng-src="images/{{data.value}}.jpg" />
Ou ainda mais simples, você pode simplesmente usar uma propriedade de escopo:
Código do controlador:
HTML no modo de exibição:
<img ui-if="showImage" ng-src="images/{{data.value}}.jpg" />
Para uma imagem de espaço reservado, basta adicionar outra
<img>
marca semelhante, mas acrescente seuui-if
parâmetro com uma!
marca de exclamação ( ) e faça com que ngSrc tenha o caminho para a imagem de espaço reservado ou use umasrc
marca conforme o HTML normal.por exemplo.
<img ui-if="!showImage" src="images/placeholder.jpg" />
Obviamente, todos os exemplos de código acima estão assumindo que cada um dos valores1, valor2, valor3 e valor4 será igual a
null
/false
quando cada uma das suas quatro informações estiver incompleta (e, portanto, também com um valor booleano detrue
quando estiverem completas).PS. O projeto AngularUI foi recentemente dividido em subprojetos, e a documentação para
ui-if
parece estar faltando atualmente (provavelmente está no pacote em algum lugar). No entanto, é bastante simples de usar, como você pode ver, e registrei um 'problema' do Github no projeto Angular UI para apontar para a equipe também.UPDATE: 'ui-if' está ausente no projeto AngularUI porque foi integrado ao código principal do AngularJS! Apenas a partir da v1.1.x, atualmente marcada como 'instável'.
fonte
ng-if
chegou ao núcleo btw (a partir de 1.1.5, se não me engano).Aqui está uma solução que eu criei usando javascript nativo. Estou verificando se a imagem está quebrada e, em seguida, adicionando uma classe à imagem e alterando a fonte.
Eu recebi parte da minha resposta em uma resposta do Quora http://www.quora.com/How-do-I-use-JavaScript-to-find-if-an-image-is-broken
fonte
Veio com minha própria solução. Ele substitui a imagem se src ou ngSrc estiver vazio e se img retornar 404.
(garfo da solução @Darren)
fonte
Isso permitirá apenas fazer loop duas vezes, para verificar se o ng-src não existe ou usar o err-src, isso evita que o loop continue.
fonte