Подтвердить что ты не робот

Использование ng-src vs src

Этот tutorial демонстрирует использование директивы ngSrc вместо src:

<ul class="phones">
    <li ng-repeat="phone in phones" class="thumbnail">
        <img ng-src="{{phone.imageUrl}}">
    </li>
</ul>

Они просят:

Замените директиву ng-src на простой старый атрибут src.
Использование таких инструментов, как Firebug или Chrome Web Inspector, или проверка журналов доступа к веб-серверу, убедитесь, что приложение действительно создает посторонний запрос /app/%7B%7Bphone.imageUrl%7D%7D (или /приложение/{{phone.imageUrl}}).

Я сделал это, и это дало мне правильный результат:

<li class="thumbnail ng-scope" ng-repeat="phone in phones">
    <img src="img/phones/motorola-xoom.0.jpg">
</li>

Есть ли причина, по которой?

4b9b3361

Ответ 1

<img ng-src="{{phone.imageUrl}}"> 

Это дает ожидаемый результат, потому что phone.imageUrl оценивается и заменяется его значением после загрузки angular.

<img src="{{phone.imageUrl}}">

Но при этом браузер пытается загрузить изображение с именем {{phone.imageUrl}}, что приводит к неудачному запросу. Вы можете проверить это в консоли своего браузера.

Ответ 2

Из угловых документов

Глючный способ написать это:

<img src="http://www.gravatar.com/avatar/{{hash}}"/>

Правильный способ написать это:

<img ng-src="http://www.gravatar.com/avatar/{{hash}}"/>

Зачем? Это связано с тем, что при загрузке страницы, перед угловой загрузкой и созданием контроллеров, браузер попытается загрузить изображение с http://www.gravatar.com/avatar/{{hash}} и это не удастся. Затем, после запуска angular, он понимает, что {{hash}} должен быть заменен, скажем, logo.png, теперь атрибут src изменяется на http://www.gravatar.com/avatar/logo.png и изображение загружается правильно. Проблема в том, что идет 2 запроса и первый сбой.

Чтобы решить эту проблему, мы должны использовать ng-src которая является угловой директивой, а angular заменит значение ng-src в атрибут src только после полной загрузки угловой загрузки и контроллеров, и в это время {{hash}} уже будет заменен на правильное значение объема.

Ответ 3

src="{{phone.imageUrl}}" не требуется и создает дополнительный запрос браузером. Браузер сделает как минимум 2 GET запросов, пытающихся загрузить это изображение:

  • перед оценкой выражения {{phone.imageUrl}}
  • после вычисления выражения img/phones/motorola-xoom.0.jpg

Вы всегда должны использовать директиву ng-src при работе с выражениями Angular. <img ng-src="{{phone.imageUrl}}"> дает ожидаемый результат одного запроса.


В боковом примечании то же самое относится к ng-href, поэтому вы не получите сломанные ссылки до тех пор, пока не начнется первый цикл дайджест.

Ответ 4

Ну, на самом деле это составляет 100%, потому что HTML обрабатывается последовательно, и когда эта HTML-страница обрабатывается по строкам, к тому времени, когда она попадает на это изображение, линия и обработка изображения, наш phone.imageUrl еще не еще не определен.

И на самом деле, Angular JS еще не обработал этот кусок HTML и еще не нашел эти заполнители и заменил эти выражения на значения. Итак, что происходит, так это то, что браузер получает эту строку и пытается извлечь это изображение по этому URL-адресу.

И, конечно же, это фиктивный URL, если в нем все еще есть эти усы и фигурные скобки, и поэтому он дает вам 404, но, разумеется, Angular позаботится об этом, он заменяет этот URL для правильный, а затем мы все еще видим изображение, но сообщение об ошибке 404 остается в нашей консоли.

Итак, как мы можем позаботиться об этом? Ну, мы не можем позаботиться об этом, используя обычные трюки HTML. Но мы можем позаботиться об этом с помощью Angular. Нам нужно как-то сказать браузеру не пытаться получить этот URL-адрес, но в то же время получить его только тогда, когда Angular готов для интерпретации этих заполнителей.

Ну, один из способов сделать это - добавить здесь атрибут Angular вместо стандартного HTML-кода. А атрибут Angular - это просто ng-src. Итак, если мы скажем это сейчас, вернитесь назад, вы увидите, что больше нет ошибок, потому что изображение получилось только после того, как Angular завладело этим HTML и перевело все выражения в их значения.