Что является лучшим способом для условного применения класса?
допустим у вас есть массив, который визуализируется в ul с li для каждого элемента и свойства на контроллере называется selectedIndex. Что было бы лучшим способом добавить класс в li с индексом selectedIndex в в AngularJS?
в настоящее время я дублирую (вручную)li код и добавление класса к одному из li теги и с помощью ng-show и ng-hide показать только один li в индексе.
22 ответов:
Если вы не хотите помещать имена классов CSS в контроллер, как я, вот старый трюк, который я использую с пред-v1 дней. Мы можем написать выражение, которое непосредственно вычисляет имя класса избранные, никаких пользовательских директив не требуется:
ng:class="{true:'selected', false:''}[$index==selectedIndex]"Пожалуйста, обратите внимание на старый синтаксис с двоеточием.
существует также новый лучший способ применения классов условно, например:
ng-class="{selected: $index==selectedIndex}"Angular теперь поддерживает выражения, которые возвращать объект. Каждое свойство (имя) этого объекта теперь рассматривается как имя класса и применяется в зависимости от его значения.
однако эти способы не являются функционально равноправными. Вот пример:
ng-class="{admin:'enabled', moderator:'disabled', '':'hidden'}[user.role]"
ng-class поддерживает выражение, которое должно возвращать либо
- строка имен классов, разделенных пробелами, или
- массив имен классов, или
- карта / объект имен классов для булевых значений.
Итак, используя форму 3) мы можем просто написать
ng-class="{'selected': $index==selectedIndex}"см. также как я могу условно применять стили CSS в AngularJS? для широкого ответ.
обновление: угловой 1.1.5 добавил поддержку для тернарный оператор, так что если эта конструкция вам более знакома:
ng-class="($index==selectedIndex) ? 'selected' : ''"
мой любимый метод - это использование тернарного выражения.
ng-class="condition ? 'trueClass' : 'falseClass'"Примечание: если вы используете старую версию Angular, вы должны использовать это вместо этого,
ng-class="condition && 'trueClass' || 'falseClass'"
Я добавлю к этому, потому что некоторые из этих ответов, кажется, устарело. Вот как я это делаю:
<class="ng-class:isSelected">где 'isSelected' - это переменная javascript, определенная в угловом контроллере с областью видимости.
Чтобы более конкретно ответить на твой вопрос, вот как вы можете создать список с:HTML
<div ng-controller="ListCtrl"> <li class="ng-class:item.isSelected" ng-repeat="item in list"> {{item.name}} </li> </div>
JS
function ListCtrl($scope) { $scope.list = [ {"name": "Item 1", "isSelected": "active"}, {"name": "Item 2", "isSelected": ""} ] }
Смотрите:http://jsfiddle.net/tTfWM/
вот гораздо более простое решение:
function MyControl($scope){ $scope.values = ["a","b","c","d","e","f"]; $scope.selectedIndex = -1; $scope.toggleSelect = function(ind){ if( ind === $scope.selectedIndex ){ $scope.selectedIndex = -1; } else{ $scope.selectedIndex = ind; } } $scope.getClass = function(ind){ if( ind === $scope.selectedIndex ){ return "selected"; } else{ return ""; } } $scope.getButtonLabel = function(ind){ if( ind === $scope.selectedIndex ){ return "Deselect"; } else{ return "Select"; } } }.selected { color:red; }<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.1/angular.min.js"></script> <div ng-app ng-controller="MyControl"> <ul> <li ng-class="getClass($index)" ng-repeat="value in values" >{{value}} <button ng-click="toggleSelect($index)">{{getButtonLabel($index)}}</button></li> </ul> <p>Selected: {{selectedIndex}}</p> </div>
я столкнулся с подобной проблемой и решил просто создать условный фильтр:
angular.module('myFilters', []). /** * "if" filter * Simple filter useful for conditionally applying CSS classes and decouple * view from controller */ filter('if', function() { return function(input, value) { if (typeof(input) === 'string') { input = [input, '']; } return value? input[0] : input[1]; }; });Он принимает один аргумент, который является 2-элементом массива или строки, которая превращается в массив, добавляется пустая строка в качестве второго элемента:
<li ng-repeat="item in products | filter:search | orderBy:orderProp | page:pageNum:pageLength" ng-class="'opened'|if:isOpen(item)"> ... </li>
Если вы хотите выйти за рамки двоичной оценки и сохранить свой CSS из вашего контроллера, вы можете реализовать простой фильтр, который оценивает входные данные для объекта карты:
angular.module('myApp.filters, []) .filter('switch', function () { return function (input, map) { return map[input] || ''; }; });Это позволяет писать разметку следующим образом:
<div ng-class="muppets.star|switch:{'Kermit':'green', 'Miss Piggy': 'pink', 'Animal': 'loud'}"> ... </div>
тернарный оператор только добавлено в угловой парсер в 1.1.5.
Итак, самый простой способ сделать это так :
ng:class="($index==selectedIndex)? 'selected' : ''"
был я недавно сделал, что делал это:
<input type="password" placeholder="Enter your password" ng-class="{true: 'form-control isActive', false: 'isNotActive'}[isShowing]">The
isShowingзначение-это значение, которое находится на моем контроллере, которое переключается одним нажатием кнопки, а части между одной скобкой-это классы, которые я создал в своем файле css.EDIT: я также хотел бы добавить, что codeschool.com имеет бесплатный курс, который спонсируется google на AngularJS, который проходит через все эти вещи, а затем некоторые. Там нет необходимости платить за что-либо, просто зарегистрироваться за аккаунт и вперед! Удачи вам всем!
у нас можете сделать функцию для управления возвращаемым классом с условием
<script> angular.module('myapp', []) .controller('ExampleController', ['$scope', function ($scope) { $scope.MyColors = ['It is Red', 'It is Yellow', 'It is Blue', 'It is Green', 'It is Gray']; $scope.getClass = function (strValue) { switch(strValue) { case "It is Red":return "Red";break; case "It is Yellow":return "Yellow";break; case "It is Blue":return "Blue";break; case "It is Green":return "Green";break; case "It is Gray":return "Gray";break; } } }]); </script>а то
<body ng-app="myapp" ng-controller="ExampleController"> <h2>AngularJS ng-class if example</h2> <ul > <li ng-repeat="icolor in MyColors" > <p ng-class="[getClass(icolor), 'b']">{{icolor}}</p> </li> </ul> <hr/> <p>Other way using : ng-class="{'class1' : expression1, 'class2' : expression2,'class3':expression2,...}"</p> <ul> <li ng-repeat="icolor in MyColors"> <p ng-class="{'Red':icolor=='It is Red','Yellow':icolor=='It is Yellow','Blue':icolor=='It is Blue','Green':icolor=='It is Green','Gray':icolor=='It is Gray'}" class="b">{{icolor}}</p> </li> </ul>вы можете обратиться к полной кодовой странице в ng-класс, если пример
Я новичок в Angular, но нашел это, чтобы решить мою проблему:
<i class="icon-download" ng-click="showDetails = ! showDetails" ng-class="{'icon-upload': showDetails}"></i>это будет условно применять класс, основанный на var. Он начинается с по умолчанию, используя ng-класс, я проверяю статус
showDetailsеслиtrue/falseи применить класс icon-upload. Его работа велика.надеюсь, что это помогает.
Он работает правильно ;)
<ul class="nav nav-pills" ng-init="selectedType = 'return'"> <li role="presentation" ng-class="{'active':selectedType === 'return'}" ng-click="selectedType = 'return'"><a href="#return">return </a></li> <li role="presentation" ng-class="{'active':selectedType === 'oneway'}" ng-click="selectedType = 'oneway'"><a href="#oneway">oneway </a></li> </ul>
Это, вероятно, будет понижено до забвения, но вот как я использовал тернарные операторы 1.1.5 для переключения классов в зависимости от того, является ли строка в таблице первой, средней или последней-за исключением того, что в таблице есть только одна строка:
<span class="attribute-row" ng-class="(restaurant.Attributes.length === 1) || ($first ? 'attribute-first-row': false || $middle ? 'attribute-middle-row': false || $last ? 'attribute-last-row': false)"> </span>
вот еще один вариант, который хорошо работает, когда ng-класс не может быть использован (например, при стилизации SVG):
ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"(Я думаю, что вам нужно быть на последнем нестабильном угле, чтобы использовать ng-attr -, я в настоящее время на 1.1.4)
ну, я бы предложил вам проверить состояние вашего контроллера с функцией возврата правда или ложные .
<div class="week-wrap" ng-class="{today: getTodayForHighLight(todayDate, day.date)}">{{day.date}}</div>и в вашем контроллере проверяем условие
$scope.getTodayForHighLight = function(today, date){ return (today == date); }
частичная
<div class="col-md-4 text-right"> <a ng-class="campaign_range === 'thismonth' ? 'btn btn-blue' : 'btn btn-link'" href="#" ng-click='change_range("thismonth")'>This Month</a> <a ng-class="campaign_range === 'all' ? 'btn btn-blue' : 'btn btn-link'" href="#" ng-click='change_range("all")'>All Time</a> </div>контроллер
$scope.campaign_range = "all"; $scope.change_range = function(range) { if (range === "all") { $scope.campaign_range = "all" } else { $scope.campaign_range = "thismonth" } };
это в моей работе несколько условно судья:
<li ng-repeat='eOption in exam.examOptions' ng-class="exam.examTitle.ANSWER_COM==exam.examTitle.RIGHT_ANSWER?(eOption.eoSequence==exam.examTitle.ANSWER_COM?'right':''):eOption.eoSequence==exam.examTitle.ANSWER_COM?'wrong':eOption.eoSequence==exam.examTitle.RIGHT_ANSWER?'right':''"> <strong>{{eOption.eoSequence}}</strong> | <span ng-bind-html="eOption.eoName | to_trusted">2020 元</span> </li>
Если вы используете angular до В1.1.5(т. е. без тернарного оператора) и вы все еще хотите эквивалентный способ, чтобы установить значение и условия, вы можете сделать что-то вроде этого:
ng-class="{'class1':item.isReadOnly == false, 'class2':item.isReadOnly == true}"
если у вас есть общий класс, который применяется ко многим элементам, вы можете создать пользовательскую директиву, которая добавит этот класс, например ng-show/ng-hide.
эта директива добавит класс 'active' к кнопке, если она нажата
module.directive('ngActive', ['$animate', function($animate) { return function(scope, element, attr) { scope.$watch(attr.ngActive, function ngActiveWatchAction(value){ $animate[value ? 'addClass' : 'removeClass'](element, 'active'); }); }; }]);Подробнее
просто добавляя что-то, что работало для меня сегодня, после долгих поисков...
<div class="form-group" ng-class="{true: 'has-error'}[ctrl.submitted && myForm.myField.$error.required]">надеюсь, что это помогает в вашем успешном развитии.
=)
Недокументированный Синтаксис Выражения: Отличная Ссылка На Веб-Сайт... =)
Регистрация http://www.codinginsight.com/angularjs-if-else-statement/
печально известный angularjs если еще заявление!!! Когда я начал использовать Angularjs, я был немного удивлен, что не смог найти оператор if/else.
Итак, я работал над проектом, и я заметил, что при использовании оператора if/else условие отображается во время загрузки. Вы можете использовать НГ-плащ исправить.
<div class="ng-cloak"> <p ng-show="statement">Show this line</span> <p ng-hide="statement">Show this line instead</span> </div>
.ng-cloak { display: none }спасибо Амаду
можно использовать этой npm пакет. Он обрабатывает все и имеет опции для статических и условных классов, основанных на переменной или функции.
// Support for string arguments getClassNames('class1', 'class2'); // support for Object getClassNames({class1: true, class2 : false}); // support for all type of data getClassNames('class1', 'class2', ['class3', 'class4'], { class5 : function() { return false; }, class6 : function() { return true; } }); <div className={getClassNames({class1: true, class2 : false})} />

Comments