Angular: условный класс с * ngClass

562

Что не так с моим угловым кодом? Я осознаю:

Cannot read property 'remove' of undefined at BrowserDomAdapter.removeClass ...

HTML

<ol class="breadcrumb">
    <li *ngClass="{active: step==='step1'}" (click)="step='step1; '">Step1</li>
    <li *ngClass="{active: step==='step2'}"  (click)="step='step2'">Step2</li>
    <li *ngClass="{active: step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
Даниил
источник

Ответы:

1230

Угловая версия 2, ..., 9 предоставляет несколько способов условного добавления классов:

введите один

[class.my-class]="step === 'step1'"

тип два

[ngClass]="{'my-class': step === 'step1'}"

и несколько вариантов:

[ngClass]="{'my-class': step === 'step1', 'my-class2':step === 'step2' }"

тип три

[ngClass]="{1:'my-class1',2:'my-class2',3:'my-class4'}[step]"

тип четыре

[ngClass]="(step=='step1')?'my-class1':'my-class2'"
MostafaMashayekhi
источник
7
Идеальный ответ, просто исправьте тип 2 следующим образом: [ngClass] = "{'my-class': step == 'step1'}" С помощью '' int имя класса
Адриано Галессо Алвес
2
Для типа три порядок имени класса и проверки неправильный. Сначала должно быть имя класса, например [ngClass] = "{'my-class1': 1, 'my-class2': 2}"
обайлись
1
Похоже, что «тип три» и «тип четыре» являются конкретными использованиями, [ngClass]="js expression returning html class string"так что они одинаковы в этом смысле
YakovL
1
Спасибо, мужик .. ты
классный
1
Идеальный ответ, приятель. Спасибо !
Анжана Силва
423

[ngClass]=...вместо *ngClass.

* только для краткого синтаксиса для структурных директив, где вы можете, например, использовать

<div *ngFor="let item of items">{{item}}</div>

вместо более длинной эквивалентной версии

<template ngFor let-item [ngForOf]="items">
  <div>{{item}}</div>
</template>

Смотрите также https://angular.io/docs/ts/latest/api/common/index/NgClass-directive.html

<some-element [ngClass]="'first second'">...</some-element>
<some-element [ngClass]="['first', 'second']">...</some-element>
<some-element [ngClass]="{'first': true, 'second': true, 'third': false}">...</some-element>
<some-element [ngClass]="stringExp|arrayExp|objExp">...</some-element>
<some-element [ngClass]="{'class1 class2 class3' : true}">...</some-element>

Смотрите также https://angular.io/docs/ts/latest/guide/template-syntax.html

<!-- toggle the "special" class on/off with a property -->
<div [class.special]="isSpecial">The class binding is special</div>

<!-- binding to `class.special` trumps the class attribute -->
<div class="special"
     [class.special]="!isSpecial">This one is not so special</div>
<!-- reset/override all class names with a binding  -->
<div class="bad curly special"
     [class]="badCurly">Bad curly</div>
Гюнтер Цохбауэр
источник
1
Из документации angular: «Звездочка - это« синтаксический сахар »для чего-то более сложного. Внутренне Angular преобразует атрибут * ngIf в элемент <ng-template>, обернутый вокруг элемента host, как это. Директива * ngIf перемещен в элемент <ng-template>, где он стал привязкой свойства, [ngIf]. Остальная часть <div>, включая атрибут class, перемещена внутри элемента <ng-template>. " - Подробнее @ angular.io/guide/structural-directives#the-asterisk--prefix
Объединить
На самом деле, нет ничего сложнее, *просто допускается упрощенный синакс вместо канонической формы.
Гюнтер Цохбауэр
76

Другое решение будет использовать [class.active].

Пример :

<ol class="breadcrumb">
    <li [class.active]="step=='step1'" (click)="step='step1'">Step1</li>
</ol>
Джоэл Алмейда
источник
8
Я думаю, что это должен быть принятый ответ, так как это Angular2 способ установить класс html (о котором я не знал, и Google привел меня сюда).
kub1x
62

Это нормальная структура для ngClass:

[ngClass]="{'classname' : condition}"

Так что в вашем случае, просто используйте это так ...

<ol class="breadcrumb">
  <li [ngClass]="{'active': step==='step1'}" (click)="step='step1'">Step1</li>
  <li [ngClass]="{'active': step==='step2'}" (click)="step='step2'">Step2</li>
  <li [ngClass]="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
Алиреза
источник
48

со следующими примерами вы можете использовать «ЕСЛИ ЕЩЕ»

<p class="{{condition ? 'checkedClass' : 'uncheckedClass'}}">
<p [ngClass]="condition ? 'checkedClass' : 'uncheckedClass'">
<p [ngClass]="[condition ? 'checkedClass' : 'uncheckedClass']">
Чайтанья Неккалапуди
источник
1
Я попробовал первое и второе решение. У меня работал только второй
user1238784
36

Вы можете использовать ngClass для применения имени класса как условно, так и не в Angular

Например

[ngClass]="'someClass'">

условный

[ngClass]="{'someClass': property1.isValid}">

Несколько Условие

 [ngClass]="{'someClass': property1.isValid && property2.isValid}">

Метод выражения

[ngClass]="getSomeClass()"

Этот метод будет внутри вашего компонента

 getSomeClass(){
        const isValid=this.property1 && this.property2;
        return {someClass1:isValid , someClass2:isValid};
    }
Код-EZ
источник
14

Вы должны использовать что-то ( [ngClass]вместо *ngClass), как это:

<ol class="breadcrumb">
  <li [ngClass]="{active: step==='step1'}" (click)="step='step1; '">Step1</li>
  (...)

Тьерри Темплиер
источник
10

В Angular 7.X

Классы CSS обновляются следующим образом, в зависимости от типа вычисления выражения:

  • string - добавлены CSS-классы, перечисленные в строке (разделенные пробелами)

  • Array - добавлены CSS-классы, объявленные как элементы Array.

  • Object-keys - это CSS-классы, которые добавляются, когда выражение, указанное в значении, принимает истинное значение, в противном случае они удаляются.

<some-element [ngClass]="'first second'">...</some-element>

<some-element [ngClass]="['first', 'second']">...</some-element>

<some-element [ngClass]="{'first': true, 'second': true, 'third': false}">...</some-element>

<some-element [ngClass]="stringExp|arrayExp|objExp">...</some-element>

<some-element [ngClass]="{'class1 class2 class3' : true}">...</some-element>
Rohit.007
источник
7

чтобы расширить МостафаМашайехи своим ответом для второго варианта> вы также можете связать несколько вариантов с помощью ','

[ngClass]="{'my-class': step=='step1', 'my-class2':step=='step2' }"

Также * ngIf может использоваться в некоторых из этих ситуаций, обычно в сочетании с * ngFor

class="mats p" *ngIf="mat=='painted'"
Роберт Леуверинк
источник
6

Пока я создавал реактивную форму, мне нужно было назначить 2 типа классов на кнопку. Вот как я это сделал:

<button type="submit" class="btn" [ngClass]="(formGroup.valid)?'btn-info':''" 
[disabled]="!formGroup.valid">Sign in</button>

Когда форма верна, у кнопки есть btn и btn-class (из начальной загрузки), иначе просто btn class.

Сарвар Нишонбоев
источник
5

Кроме того, вы можете добавить с помощью функции метода:

В HTML

<div [ngClass]="setClasses()">...</div>

В component.ts

// Set Dynamic Classes
  setClasses() {
    let classes = {
      constantClass: true,
      'conditional-class': this.item.id === 1
    }

    return classes;
  }
Альпер БУЛУТ
источник
4

Пусть YourCondition - это ваше условие или логическое свойство, тогда сделайте вот так

[class.yourClass]="YourCondition"
Абдус Салам Азад
источник
4

ngClass синтаксис:

[ngClass]="{'classname' : conditionFlag}"

Вы можете использовать так:

<ol class="breadcrumb">
  <li [ngClass]="{'active': step==='step1'}" (click)="step='step1'">Step1</li>
  <li [ngClass]="{'active': step==='step2'}" (click)="step='step2'">Step2</li>
  <li [ngClass]="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
Чираг
источник
4

Вот что сработало для меня:

[ngClass]="{'active': dashboardComponent.selected_menu == 'profile'}"
Нинад Кулкарни
источник
4

Вы можете использовать [ngClass] или [class.classname], оба будут работать одинаково.
[class.my-class]="step==='step1'"

   ИЛИ

[ngClass]="{'my-class': step=='step1'}"

Оба будут работать одинаково!

Валид Шахзаиб
источник
1

Не относится к [ngClass]директиве, но я также получаю ту же ошибку, что и

Не удается прочитать свойство 'удалить' из неопределенного в ...

и я подумал, что ошибка в моем [ngClass]состоянии, но оказалось, что свойство, к которому я пытался получить доступ, [ngClass]не было инициализировано.

Как у меня было это в моем машинописном файле

element: {type: string};

и по моему [ngClass]я использовал

[ngClass]="{'active', element.type === 'active'}"

и я получаю ошибку

Невозможно прочитать свойство 'тип' неопределенного в ...

и решение было исправить мою собственность

element: {type: string} = {type: 'active'};

Надеюсь, что это помогает кому-то, кто пытается соответствовать состоянию недвижимости в [ngClass]

Хамза Ханзада
источник
1

<div class="collapse in " [ngClass]="(active_tab=='assignservice' || active_tab=='manage')?'show':''" id="collapseExampleOrganization" aria-expanded="true" style="">
 <ul> 	 <li class="nav-item" [ngClass]="{'active': active_tab=='manage'}">
<a routerLink="/main/organization/manage" (click)="activemenu('manage')"> <i class="la la-building-o"></i>
<p>Manage</p></a></li> 
<li class="nav-item" [ngClass]="{'active': active_tab=='assignservice'}"><a routerLink="/main/organization/assignservice" (click)="activemenu('assignservice')"><i class="la la-user"></i><p>Add organization</p></a></li>
</ul></div>

Код является хорошим примером ngClass, если еще условие.

[ngClass]="(active_tab=='assignservice' || active_tab=='manage')?'show':''"

[ngClass]="{'active': active_tab=='assignservice'}"
amarbhanu
источник
0

Попробуйте вот так ..

Определите свой класс с помощью ''

<ol class="breadcrumb">
    <li *ngClass="{'active': step==='step1'}" (click)="step='step1; '">Step1</li>
    <li *ngClass="{'active': step==='step2'}"  (click)="step='step2'">Step2</li>
    <li *ngClass="{'active': step==='step3'}" (click)="step='step3'">Step3</li>
</ol>
Айшвария Катхавараян
источник