Приложение, которое я создаю, требует, чтобы мой пользователь установил 4 элемента информации, прежде чем это изображение даже сможет загрузиться. Это изображение является центральным элементом приложения, поэтому из-за неработающей ссылки на изображение может показаться, что все это работает. Я бы хотел, чтобы другое изображение заняло место на 404.
Любые идеи? Я бы не хотел писать для этого специальную директиву.
Я был удивлен, что не смог найти подобный вопрос, особенно когда первый вопрос в документации такой же!
angularjs
angularjs-directive
will_hardin
источник
источник
Ответы:
Это довольно простая директива, позволяющая следить за ошибкой при загрузке изображения и заменять файл src. (Plunker)
Html:
Javascript:
Если вы хотите отображать изображение ошибки, когда ngSrc пуст, вы можете добавить это (Plunker) :
Проблема в том, что ngSrc не обновляет атрибут src, если значение пустое.
источник
src
атрибута дляerr-src
изображения: plnkr.co/edit/b05WtghBOHkxKdttZ8q5Немного поздно на вечеринку, хотя я придумал решение более или менее той же проблемы в системе, которую создаю.
Однако моя идея заключалась в том, чтобы обрабатывать КАЖДЫЙ
img
тег изображения глобально.Я не хотел забивать себя
HTML
ненужными директивами, такими какerr-src
показанные здесь. Довольно часто, особенно с динамическими изображениями, вы не узнаете, пропали ли они, пока не станет слишком поздно. Добавление дополнительных директив на случай отсутствия изображения кажется мне излишним.Вместо этого я расширяю существующий
img
тег - что, собственно, и есть в директивах Angular.Итак - вот что я придумал.
Примечание : для этого требуется наличие полной библиотеки JQuery, а не только JQlite Angular, поставляемой с, потому что мы используем
.error()
Вы можете увидеть это в действии на этом Plunker
Директива выглядит примерно так:
Когда происходит ошибка (которая происходит из-за того, что изображение не существует или недоступно и т. Д.) Мы фиксируем и реагируем. Вы также можете попытаться получить размеры изображения - если они изначально присутствовали в изображении / стиле. Если нет, то установите для себя значение по умолчанию.
В этом примере вместо изображения используется placehold.it.
Теперь КАЖДОЕ изображение, независимо от того, используется оно
src
илиng-src
само закрыто на случай, если ничего не загружается ...источник
Чтобы расширить решение Джейсона, чтобы поймать оба случая ошибки загрузки или пустой исходной строки, мы можем просто добавить часы.
Html:
Javascript:
источник
ng-if
в шаблоне (пустая строка src)attrs.$observe('ngSrc', function(value) {...});
, это то, что ngSrc использует для внутренних целей вместо $ watchв HTML:
источник
Если изображение 404 или изображение пусто, что бы там ни было, вы можете просто использовать фильтр ng-src следующим образом :)
источник
Я использую что-то вроде этого, но предполагается, что team.logo действителен. Он устанавливает значение по умолчанию, если "team.logo" не задан или пуст.
источник
Для этого вам не нужны ни angular, ни даже CSS или JS. Если вы хотите, вы можете обернуть этот ответ (связанный) в простую директиву, чтобы упростить, вроде или что-то в этом роде, но это довольно простой процесс ... просто оберните его в тег объекта ...
Как скрыть сломанный значок изображения, используя только CSS / HTML (без js)
источник
Есть ли конкретная причина, по которой вы не можете объявить резервное изображение в своем коде?
Насколько я понимаю, у вас есть два возможных случая для вашего источника изображения:
Я думаю, что это должно обрабатываться вашим приложением - если правильный URL-адрес в настоящее время не может быть определен, вместо этого передайте URL-адрес изображения загрузки / возврата / заполнителя.
Причина в том, что у вас никогда не бывает «отсутствующего» изображения, потому что вы явно указали правильный URL-адрес для отображения в любой момент времени.
источник
Я предлагаю вам использовать директиву if statement в Angular UI Utils для решения вашей проблемы, которую можно найти на http://angular-ui.github.io/ . Я только что использовал его, чтобы сделать то же самое.
Это не проверено, но вы можете сделать что-то вроде:
Код контроллера:
(или проще)
HTML в представлении:
<img ui-if="showImage()" ng-src="images/{{data.value}}.jpg" />
Или, что еще проще, вы можете просто использовать свойство области:
Код контроллера:
HTML в представлении:
<img ui-if="showImage" ng-src="images/{{data.value}}.jpg" />
Для изображения-заполнителя просто добавьте еще один аналогичный
<img>
тег, но добавьте кui-if
параметру восклицательный знак (!
) и либо укажите в ngSrc путь к изображению-заполнителю, либо просто используйтеsrc
тег в соответствии с обычным старым HTML.например.
<img ui-if="!showImage" src="images/placeholder.jpg" />
Очевидно, что все приведенные выше примеры кода предполагают, что каждое из значений value1, value2, value3 и value4 будет приравниваться к
null
/,false
когда каждая из ваших 4 частей информации является неполной (и, следовательно, также с логическим значением,true
когда они завершены).PS. Проект AngularUI недавно был разбит на подпроекты, и документация для него,
ui-if
похоже, в настоящее время отсутствует (хотя она, вероятно, находится где-то в пакете). Однако, как вы можете видеть, его довольно просто использовать, и я зарегистрировал проблему Github в проекте пользовательского интерфейса Angular, чтобы указать на нее и команде.ОБНОВЛЕНИЕ: ui-if отсутствует в проекте AngularUI, потому что он интегрирован в основной код AngularJS! Только начиная с версии 1.1.x, которая в настоящее время помечена как «нестабильная».
источник
ng-if
сделал это в ядре кстати (по состоянию на 1.1.5, если не ошибаюсь).Вот решение, которое я придумал, используя собственный javascript. Я проверяю, не повреждено ли изображение, затем на всякий случай добавляю класс к изображению и меняю источник.
Я получил часть своего ответа из ответа Quora http://www.quora.com/How-do-I-use-JavaScript-to-find-if-an-image-is-broken
источник
Придумал собственное решение. Он заменяет изображение как если src или ngSrc пусто, так и если img возвращает 404.
(вилка решения @Darren)
источник
Это позволит выполнить цикл только дважды, чтобы проверить, не существует ли ng-src, иначе используйте err-src, это предотвратит продолжение цикла.
источник