AngularJS ng-класс несколько условий с оператором или

Я пытаюсь найти хороший синтаксис для добавления классов в зависимости от значения угла. Я хочу активировать класс в отношении 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-statement (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, даже при повторном нажатии, затем class fa-star будет применяться всегда с тех пор.

если по умолчанию favorite is 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


вы можете использовать выражение с ng-class

  <i class="fa orange" ng-class="favorite || fav == myfav.id ? 'fav' : 'no-fav'"></i>