Условно изменить 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 ответов:
вместо
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'}}" />