Как условно применить стили CSS в AngularJS?
Q1. Предположим, я хочу изменить внешний вид каждого "элемента", который пользователь отмечает для удаления, прежде чем будет нажата основная кнопка "Удалить". (Эта непосредственная визуальная обратная связь должна устранить необходимость в пресловутом "вы уверены?" диалоговое окно.) Пользователь установит флажки, чтобы указать, какие элементы должны быть удалены. Если флажок снят, этот элемент должен вернуться к своему обычному виду.
каков наилучший способ применить или удалить стиль CSS?
Q2. Предположим, я хочу, чтобы каждый пользователь мог персонализировать, как представлен мой сайт. Например, выберите из фиксированного набора размеров шрифта, разрешите определяемые пользователем цвета переднего плана и фона и т. д.
каков наилучший способ применить стиль CSS, который пользователь выбирает / вводит?
13 ответов:
Angular предоставляет ряд встроенных директив для управления стилем CSS условно / динамически:
- НГ-класс - использовать, когда набор стилей CSS статичен / известен заранее
- ng-style - используйте, когда вы не можете определить класс CSS, потому что значения стиля могут изменяться динамически. Подумайте о программируемом управлении стилем ценности.
- НГ-шоу и ng-hide - используйте, если вам нужно только показать или скрыть что-то (изменяет CSS)
- НГ-если - новое в версии 1.1.5, используйте вместо более подробного ng-переключателя, если вам нужно только проверить одно условие (изменяет DOM)
- ng-switch - использовать вместо использования нескольких взаимоисключающих ng-шоу (изменяет Дом)
- ng-disabled и ng-readonly - используется для ограничения поведения элемента формы
- ng-animate - новое в версии 1.1.4, используйте для добавления CSS3 переходы / анимации
обычный "угловой способ" включает привязку свойства модели / области к элементу пользовательского интерфейса, который будет принимать пользовательский ввод / манипулирование (т. е. использовать ng-model), а затем связывать это свойство модели с одна из встроенных директив, упомянутых выше.
когда пользователь изменяет пользовательский интерфейс, Angular автоматически обновит связанные элементы на странице.
Q1 звучит как хороший случай для ng-класса - стиль CSS может быть захвачен в классе.НГ-класс принимает "выражение", которое должно быть равно одному из следующих значений:
- строка имен классов, разделенных пробелами
- массив класса имена
- карта / объект имен классов для булевых значений
предполагая, что ваши элементы отображаются с помощью ng-repeat над некоторой моделью массива, и что когда флажок для элемента установлен, вы хотите применить
pending-deleteкласс:<div ng-repeat="item in items" ng-class="{'pending-delete': item.checked}"> ... HTML to display the item ... <input type="checkbox" ng-model="item.checked"> </div>выше мы использовали тип выражения ng-class #3-a map / object имен классов для булевых значений.
Q2 звучит как хороший случай для ng-стиля - Стиль CSS динамичен, поэтому мы не можем определите класс для этого.ng-style принимает "выражение", которое должно иметь значение:
- карта / объект имен стилей CSS для значений CSS
для надуманного примера предположим, что пользователь может ввести имя цвета в текстовое поле для цвета фона (выбор цвета jQuery был бы намного лучше):
<div class="main-body" ng-style="{color: myColor}"> ... <input type="text" ng-model="myColor" placeholder="enter a color name">
Скрипка для обоих из вышеперечисленных.Скрипка также содержит пример из НГ-шоу и ng-hide. Если флажок установлен, в дополнение к цвету фона, который становится розовым, отображается некоторый текст. Если в текстовое поле вводится 'red', div становится скрытым.
я нашел проблемы при применении классов внутри таблица элементы, когда у меня был один класс, уже примененный ко всей таблице (например, цвет, примененный к нечетным строкам
<myClass tbody tr:nth-child(even) td>). Кажется, что, когда вы осмотрите элемент Инструменты Разработчика наelement.styleне имеет назначенный стиль. Так что вместо использованияng-class, Я пробовал использоватьng-style, и в этом случае новый атрибут CSS появляется внутриelement.style. Этот код отлично работает для я:<tr ng-repeat="element in collection"> [...amazing code...] <td ng-style="myvar === 0 && {'background-color': 'red'} || myvar === 1 && {'background-color': 'green'} || myvar === 2 && {'background-color': 'yellow'}">{{ myvar }}</td> [...more amazing code...] </tr>Myvar это то, что я оцениваю, и в каждом случае я применяю стиль к каждому
<td>в зависимости от myvar значение, которое перезаписывает текущий стиль, применяемый классом CSS для всей таблицы.обновление
если вы хотите применить класс к таблице, например, при посещении страницы или в других случаях, вы можете использовать эту структуру:
<li ng-class="{ active: isActive('/route_a') || isActive('/route_b')}">в основном, что нам нужно активировать ng-class это класс для применения и истинное или ложное утверждение. правда применяет класс и ложные нет. Так вот у нас две проверки маршрута странице и или между ними, так что если мы в
/route_aили мы вroute_bна активный класса.это работает только с логической функцией справа, которая возвращает true или ложный.
Итак, в первом примере,ng-style обусловлен тремя утверждениями. Если все они ложны, стиль не применяется, но, следуя нашей логике, по крайней мере один будет применен, поэтому логическое выражение проверит, какое сравнение переменных истинно, и поскольку непустой массив всегда истинен, это оставит массив в качестве возврата и только с одним true, учитывая, что мы используем или для всего ответа, оставшийся стиль будет прикладная.
кстати, я забыл дать вам функцию isActive ():
$rootScope.isActive = function(viewLocation) { return viewLocation === $location.path(); };НОВОЕ ОБНОВЛЕНИЕ
здесь у вас есть что-то, что я нахожу действительно полезным. Когда вам нужно применить класс В зависимости от значения переменной, например, значок в зависимости от содержания
div, вы можете использовать следующий код (очень полезно вng-repeat):<i class="fa" ng-class="{ 'fa-github' : type === 0, 'fa-linkedin' : type === 1, 'fa-skype' : type === 2, 'fa-google' : type === 3 }"></i>иконы шрифт Потрясающе
Это хорошо работает, когда ng-класс не может быть использован (например, при стилизации SVG):
ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"(Я думаю, что вам нужно быть на последнем нестабильном угле, чтобы использовать ng-attr -, я в настоящее время на 1.1.4)
я опубликовал статью о работе с AngularJS+SVG. Он говорит об этой проблеме и многих других. http://www.codeproject.com/Articles/709340/Implementing-a-Flowchart-with-SVG-and-AngularJS
span class="circle circle-{{selectcss(document.Extension)}}">и код
$scope.selectcss = function (data) { if (data == '.pdf') return 'circle circle-pdf'; else return 'circle circle-small'; };css
.circle-pdf { width: 24px; height: 24px; font-size: 16px; font-weight: 700; padding-top: 3px; -webkit-border-radius: 12px; -moz-border-radius: 12px; border-radius: 12px; background-image: url(images/pdf_icon32.png); }
Это решение сделало трюк для меня
<a ng-style="{true: {paddingLeft: '25px'}, false: {}}[deleteTriggered]">...</a>
еще один вариант, когда вам нужен простой стиль css одного или двух свойств:
View:
:<tr ng-repeat="element in collection"> [...amazing code...] <td ng-style="{'background-color': getTrColor(element.myvar)}"> {{ element.myvar }} </td> [...more amazing code...] </tr>$scope.getTrColor = function (colorIndex) { switch(colorIndex){ case 0: return 'red'; case 1: return 'green'; default: return 'yellow'; } };
можно использовать тернарное выражение. Есть два способа сделать это:
<div ng-style="myVariable > 100 ? {'color': 'red'} : {'color': 'blue'}"></div>или...
<div ng-style="{'color': (myVariable > 100) ? 'red' : 'blue' }"></div>
пример
<!DOCTYPE html> <html ng-app> <head> <title>Demo Changing CSS Classes Conditionally with Angular</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script> <script src="res/js/controllers.js"></script> <style> .checkboxList { border:1px solid #000; background-color:#fff; color:#000; width:300px; height: 100px; overflow-y: scroll; } .uncheckedClass { background-color:#eeeeee; color:black; } .checkedClass { background-color:#3ab44a; color:white; } </style> </head> <body ng-controller="TeamListCtrl"> <b>Teams</b> <div id="teamCheckboxList" class="checkboxList"> <div class="uncheckedClass" ng-repeat="team in teams" ng-class="{'checkedClass': team.isChecked, 'uncheckedClass': !team.isChecked}"> <label> <input type="checkbox" ng-model="team.isChecked" /> <span>{{team.name}}</span> </label> </div> </div> </body> </html>
по состоянию на AngularJS v1.2. 0 rc,
ng-classи дажеng-attr-classсбой с элементами SVG (они работали раньше, даже с нормальной привязкой внутри атрибута класса)в частности, ни один из них не работает сейчас:
ng-class="current==this_element?'active':' ' " ng-attr-class="{{current==this_element?'active':' '}}" class="class1 class2 .... {{current==this_element?'active':''}}"в качестве обходного пути, я должен использовать
ng-attr-otherAttr="{{current==this_element?'active':''}}"и затем с помощью
[otherAttr='active'] { ... styles ... }
еще один (в будущем) способ условно применить стиль-это условно создать стиль с областью действия
<style scoped type="text/css" ng-if="..."> </style>но в настоящее время только FireFox поддерживает стили с областью видимости.
этот параметр использует службу с переменными службы, которые задаются контроллером и наблюдаются директивой атрибута, которую я называю "пользовательским стилем". Эта стратегия может быть использована в много разных способов, и я попытался дать некоторые общие указания с этим скрипка.
var app = angular.module('myApp', ['ui.bootstrap']); app.service('MainService', function(){ var vm = this; }); app.controller('MainCtrl', function(MainService){ var vm = this; vm.ms = MainService; }); app.directive('customStyle', function(MainService){ return { restrict : 'A', link : function(scope, element, attr){ var style = angular.element('<style></style>'); element.append(style); scope.$watch(function(){ return MainService.theme; }, function(){ var css = ''; angular.forEach(MainService.theme, function(selector, key){ angular.forEach(MainService.theme[key], function(val, k){ css += key + ' { '+k+' : '+val+'} '; }); }); style.html(css); }, true); } }; });
ну, я бы предложил вам проверить состояние вашего контроллера с функцией возврата правда или ложные .
<div class="week-wrap" ng-class="{today: getTodayForHighLight(todayDate, day.date)}">{{day.date}}</div>и в вашем контроллере проверяем условие
$scope.getTodayForHighLight = function(today, date){ return (today == date); }
одна вещь, чтобы смотреть - если стиль CSS имеет тире - вы должны удалить их. Так что если вы хотите установить
background-colorправильный способ-это:ng-style="{backgroundColor:myColor}"
Comments