Кутовий: умовний клас з * 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>

Відповіді:


1225

У кутовій версії 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'"

7
Ідеальна відповідь, просто зафіксуйте тип 2 на: [ngClass] = "{'my-class': step == 'step1'}" За допомогою '' int імені класу
Адріано Галессо Алвеш

2
Для третього типу порядок назви класу та перевірки неправильний. Спершу це має бути назва класу, наприклад [ngClass] = "{'my-class1': 1, 'my-class2': 2}"
obaylis

1
виглядає як "тип три" та "тип чотири" є специфічними звичаями, [ngClass]="js expression returning html class string"так що в цьому сенсі
однакові

1
Спасибі людино ... Ви дивовижні
Pranav MS

1
Ідеальна відповідь товариш. Дуже дякую !
Аняна Сільва

422

[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 переводить атрибут * ngIf в елемент <ng-template>, обгорнутий навколо хост-елемента, як це. Директива * ngIf перемістився до елемента <ng-template>, де він став властивістю зв’язку, [ngIf]. Решта <div>, включаючи атрибут класу, перемістилася всередині елемента <ng-template>. " - більше інформації @ angular.io/guide/structural-directives#the-asterisk--prefix
Поєднайте

Насправді це нічого складнішого, *просто дозволяє спрощений синаксис замість канонічної форми.
Günter Zöchbauer

75

Іншим рішенням буде використання [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

із наведеними нижче прикладами ви можете використовувати "IF ELSE"

<p class="{{condition ? 'checkedClass' : 'uncheckedClass'}}">
<p [ngClass]="condition ? 'checkedClass' : 'uncheckedClass'">
<p [ngClass]="[condition ? 'checkedClass' : 'uncheckedClass']">

1
Я спробував перше і друге рішення. Для мене працював лише другий
користувач1238784

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};
    }

14

Вам слід використовувати щось ( [ngClass]замість цього *ngClass):

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


10

В Angular 7.X

Класи CSS оновлюються наступним чином, залежно від типу оцінки виразів:

  • рядок - додаються CSS-класи, перелічені в рядку (пробіл)

  • Масив - додаються класи CSS, оголошені як елементи масиву

  • Об'єкт - клавіші - це 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>

7

щоб продовжити MostafaMashayekhi його відповідь на другий варіант> ви також можете зв’язати кілька варіантів з ","

[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-клас (з bootstrap), інакше просто клас btn.


5

Крім того, ви можете додати за допомогою функції методу:

В HTML

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

В компонент.ц

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

    return classes;
  }


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] або [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'}"

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.