AngularJS ng-класс множественных условий с оператором OR
Я пытаюсь найти хороший синтаксис для добавления классов в зависимости от угловых значений. Я хочу активировать класс в отношении 2-х условий (одно для изменений пользователя в реальном времени и одно для загрузки данных) с оператором OR.
Вот строка:
<a href="" ng-click="addFavorite(myfav.id);favorite=!favorite">
<i class="fa orange" ng-class="{'fa-star': (favorite || (fav==myfav.id)), 'fa-star-o': !favorite}"></i>
</a>
Я попробовал несколько других кодов, таких как этот :
ng-class="{'fa-star': favorite, 'fa-star': (fav==myfav.id), 'fa-star-o': !favorite}"
Без всякого успеха. Может кто-нибудь помочь мне найти хороший синтаксис ?
4 ответа:
Попробуйте это.
<a href="" ng-click="addFavorite(myfav.id);favorite=!favorite"> <i class="fa orange" ng-class="{'fa-star': favorite || fav==myfav.id, 'fa-star-o': !favorite}"></i>
Скобки не нужны.
Как только вы должны добавить некоторую логику за
ng-class
, Всегда лучше придерживаться использования контроллера для этого. Вы можете сделать это двумя способами: синтаксис JSON (такой же, как в вашем HTML, только более читаемый) или, очевидно, JavaScript.Синтаксис HTML (JSON)
HTML
<i ng-class="getFavClassIcon(myFav.id)"></i>
JS
$scope.getFavClassIcon= function (favId) { return { 'fa-star-o' : !$scope.favorite, 'fa-star' : $scope.favorite || $scope.fav === favId }; };
Старый добрый IF-оператор (JavaScript)
HTML
<i ng-class="getFavClassIcon(myFav.id)"></i>
JS
$scope.getFavClassIcon= function (favId) { if (!$scope.favorite) { return 'fa-star-o'; } else if ($scope.favorite) { // obviously you can use OR operator here return 'fa-star'; } else if ($scope.fav === favId) { return 'fa-star'; } };
HTML останется прежним
<a href="" ng-click="addFavorite(myfav.id);favorite=!favorite"> <i ng-class="{'fa-star-o':!favorite,'fa-star':favorite||fav===myfav.id}"></i> </a>
Но порядок, в котором классы присутствуют в вашем файле CSS, будет иметь значение
Класс
Поэтому , если после щелчка один раз , предположим , чтоfa-star
будет применяться либо когдаfavorite
истинно, либо когдаfav===myfav.id
возвращает true.fav===myfav.id
возвращает true и продолжает возвращать true, даже при повторном щелчке, то классfa-star
будет применяться всегда с этого момента.Если по умолчанию
favorite
равно false, тоfa-star-o
будет применяться, когда шаблон загружается в первый раз ,но после первого щелчка , когдаfavorite
установлено в true, он будет удален. Затем при втором щелчке, когдаfavorite
снова устанавливается в false,fa-star-o
он будет применен, но в этом случае классfa-star
также будет применен, поскольку условиеfa===myfav.id
все еще будет возвращать true (предполагая, что это так).Поэтому вам нужно будет определить приоритет, какой класс должен быть применен наверняка, когда он присутствует на элементе, поскольку может возникнуть случай, когда оба класса могут присутствовать на элементе. то же самое и со стихией. Например, если класс
fa-star-o
имеет более высокий приоритет, то поместите его нижеfa-star
в вашем CSS, например.fa-star { border: 1px solid #F00; } .fa-star-o { border: 1px solid #000; }
Смотрите рабочее демо по адресу http://plnkr.co/edit/Dh59KUU41uWpIkHIaYrO?p=preview