Разница между привязкой [ngClass] и [class]

В чем разница в Angular 2 между следующими фрагментами:

<div [class.extra-sparkle]="isDelightful">
<div [ngClass]="{'extra-sparkle': isDelightful}">

person Ben Taliadoros    schedule 26.07.2017    source источник
comment
Стоит отметить, что существует также привязка свойств [className], которую можно использовать таким же образом <div [className]="isDelightful ? 'extra-sparkle'">.   -  person Mike Poole    schedule 11.03.2020
comment
Разве вам не нужно дополнять тернар :? В противном случае используйте && вместо? будет действительным   -  person Ben Taliadoros    schedule 06.06.2020


Ответы (7)


Это специальный синтаксис привязки Angular

<div [class.extra-sparkle]="isDelightful">

Это часть компилятора Angular, и вы не можете создать собственный вариант привязки, следуя этому стилю привязки. Поддерживаются только [class.xxx]="...", [style.xxx]="..." и [attr.xxx]="...".

ngClass - это обычная директива Angular, которую вы можете создать самостоятельно

<div [ngClass]="{'extra-sparkle': isDelightful}">

ngClass более мощный. Он позволяет связать строку классов, массив строк или объект, как в вашем примере.

person Günter Zöchbauer    schedule 26.07.2017
comment
Итак, в документации, когда говорится ‹div [attr.role] = myAriaRole›, он привязывает атрибут роли элемента div, а не атрибут роли объекта с именем attr из контроллера. Имеет смысл, спасибо - person Ben Taliadoros; 26.07.2017
comment
attr.foo предназначен для привязки к атрибутам, а не к свойствам. См. stackoverflow.com/questions/6003819/ . @Input() компонентов и директив Angular рассматриваются как свойства. Привязка к атрибутам поддерживает только строковые значения, атрибуты поддерживают любые значения. Если существует @Input() с совпадающим именем, используемым для привязки к атрибуту, значение также будет передано в @Input(). Если вы привязываетесь к собственному атрибуту элементов (например, for в <label>, тогда браузер имеет собственную реализацию того, как значение отражается в свойстве. - person Günter Zöchbauer; 26.07.2017
comment
Спасибо, хотя я думаю, что привязка к атрибутам поддерживает только строковые значения, атрибуты поддерживают любые значения. может быть неправильно напечатан? - person Ben Taliadoros; 26.07.2017
comment
@BenTaliadoros, спасибо, ты прав. свойства должны поддерживать любые значения. - person Günter Zöchbauer; 26.07.2017
comment
Итак, какой из них лучше в этом сценарии по производительности? Неважно, какой вы используете? - person Esteban Chornet; 25.11.2019
comment
Привязка к class, вероятно, быстрее, потому что она просто назначает всю строку. ngClass должен следить за выражением и, возможно, придется добавлять / удалять отдельные классы при изменении выражения. Обычно в любом случае лучше использовать ngClass, потому что привязка к class просто перезаписывает классы, которые могут быть установлены из другого места, и аргумент производительности, вероятно, является просто преждевременным случаем оптимизации. - person Günter Zöchbauer; 25.11.2019
comment
ну на самом деле [class] = {'extra-sparkle': isDelightful} тоже работает ... - person romainm; 28.04.2020
comment
@romanm Да, это тоже должно сработать. Разница в том, что ваша версия будет переопределять классы, добавленные другими способами, потому что [class] - это полное свойство / атрибут HTML class="xxx", тогда как варианты в моем ответе добавляют / удаляют только класс extra-sparkle и оставляют другие классы как есть. - person Günter Zöchbauer; 28.04.2020

Две приведенные выше строки кода относятся к CSS class привязке в Angular. В основном есть 2-3 способа привязать класс css к компонентам angular.

Вы указываете имя класса, заключенное в квадратные скобки в class.className, а затем выражение справа, которое должно оцениваться как истинное или ложное, чтобы определить, следует ли применять класс. Это ниже, где extra-sparkle (ключ) - это класс css и isDelightful(value).

<div [class.extra-sparkle]="isDelightful">

Когда потенциально необходимо добавить несколько классов, очень удобна директива NgClass. NgClass должен получить объект с именами классов в качестве ключей и выражений, которые оцениваются как истинные или ложные. extra-sparkle - это ключ, а isDelightful - значение (boolean).

<div [ngClass]="{'extra-sparkle': isDelightful}">

Теперь, наряду с дополнительным блеском, вы также можете украсить свой div.

<div [ngClass]="{'extra-sparkle': isDelightful,'extra-glitter':isGlitter}">

or

export class AppComponent {
    isDelightful: boolean = true;
    isGlitter:  boolean = true;
    
    get sparkleGlitter()
    {
        let classes = {
            extra-sparkle: this.isDelightful,
            extra-glitter: this.isGlitter
        };
        return classes;
    }
}

<div [ngClass]='sparkleGlitter'>

Для ngClass у вас также могут быть условные тернарные операторы.

person Hameed Syed    schedule 21.05.2018

Используя [ngClass], вы можете очень удобно применять несколько классов. Вы даже можете применить функцию, которая вернет объект классов. [class. позволяет применять только один класс (конечно, вы можете использовать class. Несколько раз, но это выглядит очень плохо).

person elzoy    schedule 26.07.2017

В [ngClass] вы можете добавить один из двух разных классов, например:

<div [ngClass]="a === b ? 'class1' : 'class2'">
person FierceDev    schedule 26.07.2017
comment
Вы также можете сделать это ‹div class = {{a === b? 'class1': 'class2'}} › - person Ben Taliadoros; 26.07.2017
comment
Такое поведение в ответе не различает [ngClass]. Вы можете сделать то же самое с [class]. - person Will; 03.08.2017
comment
как уже упоминалось, то же самое можно сделать с помощью [class], пожалуйста, обновите свой ответ. - person Ahmed Hasn.; 24.08.2017

В текущей версии Angular также работает следующий синтаксис:

[class]="{toggled: sidebarActive, test: true,test1: sidebarActive}

Итак, насколько я понимаю, нет разницы между использованием ngClass и [class] привязки?

Пример

person Daniel Budzyński    schedule 30.11.2020
comment
Вы задаете вопрос? - person Scratte; 01.12.2020
comment
Отвечаю на вопрос, но он довольно старый. Единственное отличие, которое я смог найти, заключалось в том, что ngClass может обрабатывать несколько привязок классов, в то время как привязка [class] может обрабатывать только один, но, похоже, это не так. Так что мой единственный вопрос - есть ли разница? - person Daniel Budzyński; 01.12.2020
comment
Вы не должны задавать вопрос в поле ответа :) См. тур и как ответить. Но вы говорите, что половина вашего сообщения - это ответ .. а другая - вопрос. - person Scratte; 01.12.2020
comment
Большая часть моего ответа на самом деле отвечает на вопрос о новой версии angular. Итак, как я сказал ранее, я не задаю вопрос, вопрос, который я задал, скорее риторический и подмышечный. - person Daniel Budzyński; 01.12.2020

Да, с помощью привязки классов ([class]) мы также можем присоединить несколько классов css с последними версиями. пример: [class] = '{объект с ключом в качестве имени класса и значением как true / false}' то же, что и [ngClass], поэтому ... нет никакой разницы между привязкой [class] и встроенной директивой [ngClass]

person Venkateswara    schedule 10.05.2021

Никто не упомянул, что при использовании привязок [class] и [ngClass] может возникнуть некоторая путаница, если вы попытаетесь передать некоторую строку класса в [class], которая «зарегистрирована» [ngClass]. Они могут соревноваться.

Например. это не будет назначать значение класса 'd-flex' привязке [class], пока условие [ngClass], которое связано с этим классом, имеет истинное условие

component.html

<div [ngClass]="{'d-flex': falseCondition}" [class]="getClassBasedOnCondition()">

component.ts

public getClassBasedOnCondition(): string {
    return trueCondition ? 'd-flex' : '';
}

Вы можете использовать [class.] вместо [ngClass], чтобы избежать такого поведения, пока у вас нет сплава класса, например [ngClass]="{'d-flex p-1': condition}"

person arhacktect    schedule 29.05.2021