Условно изменить img src на основе данных модели


Я хочу представить данные модели в виде разных изображений с использованием углового, но с некоторыми проблемами найти "правильный" способ сделать это. Угловой API docs on expressions говорят, что условные выражения не допускаются...

упрощая много, данные модели извлекаются через AJAX и показывает вам состояние каждого интерфейса на маршрутизаторе. Что-то вроде:

$scope.interfaces = ["UP", "DOWN", "UP", "UP", "UP", "UP", "DOWN"]

Итак, в Angular мы можем отображать состояние каждого интерфейса с чем-то например:

<ul>
  <li ng-repeat=interface in interfaces>{{interface}}
</ul>

но-вместо значений из модели, я хотел бы показать подходящее изображение. Что-то следующее этой общей идее.

<ul>
  <li ng-repeat=interface in interfaces>
    {{if interface=="UP"}}
       <img src='green-checkmark.png'>
    {{else}}
       <img src='big-black-X.png'>
    {{/if}}
</ul>

(я думаю, что Эмбер поддерживает этот тип конструкта)

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

эта публикация SO предложила использовать директиву для изменения источник bg-img. Но затем мы возвращаемся к размещению URL-адресов в JS, а не в шаблоне...

все предложения с благодарностью. Спасибо.

пожалуйста, простите любые опечатки

5 66

5 ответов:

вместо src вам нужно ng-src.

представления AngularJS поддерживают двоичные операторы

condition && true || false

так что ваши img тег будет выглядеть так

<img ng-src="{{interface == 'UP' && 'green-checkmark.png' || 'big-black-X.png'}}"/>

Примечание : цитаты (т. е. зеленый-галочка.png') здесь важны. Это не будет работать без кавычек.

plunker здесь(откройте dev tools, чтобы увидеть созданный HTML)

Другой альтернативой (кроме бинарных операторов, предложенных @jm -) является использование ng-switch:

<span ng-switch on="interface">
   <img ng-switch-when="UP" src='green-checkmark.png'>
   <img ng-switch-default   src='big-black-X.png'>
</span>

ng-переключатель, вероятно, будет лучше/проще, если у вас есть более двух изображений.

другой путь ..

<img ng-src="{{!video.playing ? 'img/icons/play-rounded-button-outline.svg' : 'img/icons/pause-thin-rounded-button.svg'}}" />
<ul>
  <li ng-repeat=interface in interfaces>
       <img src='green-checkmark.png' ng-show="interface=='UP'" />
       <img src='big-black-X.png' ng-show="interface=='DOWN'" />
  </li>
</ul>

для углового 4 я использовал

<img [src]="data.pic ? data.pic : 'assets/images/no-image.png' " alt="Image" title="Image">

это работает для меня , я надеюсь, что он может использовать других для Angular 4-5. :)