Як додати умовний атрибут у Angular 2?


276

Як я можу умовно додати атрибут елемента, наприклад, checkedпрапорець?

Попередні версії Angular мали, NgAttrі я думаю, NgCheckedякі, здається, забезпечують функціонал, про який я хочу. Однак, схоже, ці атрибути не існують у Angular 2, і я не бачу іншого способу забезпечення цієї функціональності.


1
Дивіться також: stackoverflow.com/questions/36240736/…
Matty


2
googlers, якщо ви хочете, щоб атрибут без значення для кутового компонента, дивіться тут
Frank

Відповіді:


574

null видаляє його:

[attr.checked]="value ? '' : null"

або

[attr.checked]="value ? 'checked' : null"

Підказка:

Атрибут vs власності

Коли елемент HTML, куди ви додаєте це прив'язування, не має властивості з іменем, яке використовується у прив'язці ( checkedв даному випадку), а також жоден кутовий компонент чи директива не застосовується до того ж елемента, що має @Input() checked;, тоді [xxx]="..."його не можна використовувати.

Дивіться також Яка різниця між властивостями та атрибутами в HTML?

З чим зв’язати, коли такої власності немає

Альтернативи [style.xxx]="...", [attr.xxx]="...", в [class.xxx]="..."залежності від того, що ви намагаєтеся досягти.

Тому що <input>має лише checkedатрибут, але жодна checkedвластивість не [attr.checked]="..."є правильним для цього конкретного випадку.

Атрибути можуть обробляти лише рядкові значення

Поширений підводний камінь також полягає в тому, що для [attr.xxx]="..."прив'язки значення ( ...) завжди поглиблюється. Тільки властивості і @Input()s можуть отримувати інші типи значень, такі як булева, кількість, об'єкт, ...

Більшість властивостей та атрибутів елементів пов'язані між собою та мають однакову назву.

Зв'язок властивості-атрибута

Прив'язане до атрибута, властивість також отримує лише атрибутизоване значення.
Прив'язавшись до властивості, властивість отримує пов'язане з нею значення (булеве число, число, об'єкт, ...) і атрибут знову закреслене значення.

Два випадки, коли назви атрибутів та властивостей не збігаються.

Кутовий змінено з тих пір і знає про ці особливі випадки та обробляє їх, щоб ви могли прив’язатись, <label [for]="навіть якщо такої властивості не існує (те саме для colspan)


3
Ви можете опустити "attr". префікс.
Філіп Стахов'як

16
@FilipStachowiak тоді не стане атрибутом. На багатьох елементах існують різні властивості, де сам елемент відображає значення, пов'язане з властивістю атрибуту (а також інший напрямок). У цьому випадку вам не потрібно attr.. Але якщо ви хочете додати спеціальний атрибут, вам обов'язково потрібен attr.префікс
Günter Zöchbauer

14
Щоб було ясно, вам потрібно в attr.частину цього. Я намагався встановити [href]і хотів, щоб він був встановлений, якщо hrefіснує властивість елемента . Без [attr.href]цього додається href зі значенням 'null', яке при натисканні на нього оновить поточну сторінку. [attr.href]виправили це.
dudewad

@dudewad, що мені не підходить. Якщо ви встановите hrefелемент, який має hrefвластивість, використовувати його не потрібно attr. Повинно щось не так.
Günter Zöchbauer

@ günter-zöchbauer Ну, я використовую Ng 4.x, і <a [href]="item.href">де item.hrefне визначено (не значення не визначено, але властивість hrefне існує item) було встановлено hrefатрибут null. Я не заглиблювався в джерело, бо, чесно кажучи, мені це не дуже хвилює (це крихітна деталь), але attr.це зовсім інша директива, і тому вона діє по-різному, не дивує мене.
dudewad

37

у синтаксисі атрибута angular-2 є

<div [attr.role]="myAriaRole">

Прив'язує роль атрибута до результату вираження myAriaRole.

тому можна використовувати як

[attr.role]="myAriaRole ? true: null"

9
Проблема тут полягає в тому , що , коли your expressionє falseатрибут в DOM буде виглядати <div checked="false">. Я не думаю, що це запланований ефект.
Гюнтер Зехбауер

7
Дякую, але я запитав, як умовно додати атрибут, а не умовно призначити його значення.
Джонатан Майлз

Можна навіть опустити "attr". префікс.
Філіп Стахов'як

1
@FilipStachowiak тоді не стане атрибутом. На багатьох елементах існують різні властивості, де сам елемент відображає значення, пов'язане з властивістю атрибуту (а також інший напрямок). У цьому випадку вам не потрібно attr.. Але якщо ви хочете додати спеціальний атрибут, вам обов'язково потрібен attr.префікс
Günter Zöchbauer

о людино, це: null є дивовижною, річ знала, що це можна використовувати в умовних умовах! дякую за рішення.
пінарела

17

Уточнюючи відповідь Гюнтера Зехбауера:

Зараз, здається, це інакше. Я намагався це зробити, щоб умовно застосувати атрибут href до тега якоря. Ви повинні використовувати невизначений для випадку "не застосовувати". Як приклад, я продемонструю за допомогою посилання, умовно із застосованим атрибутом href.

Тег прив’язки без атрибута href стає простим текстом із зазначенням заповнювача для посилання на специфікацію гіперпосилання .

Для навігації у мене є список посилань, але одне з цих посилань являє собою поточну сторінку. Я не хотів, щоб посилання на поточній сторінці було посиланням, але все ж хочу, щоб воно відображалось у списку (у ньому є деякі власні стилі, але цей приклад спрощено).

<a [attr.href]="currentUrl !== link.url ? link.url : undefined">

Я думаю, це чистіше, ніж використання двох * ngIf на тезі "span and anchor".


5

Якщо це вхідний елемент, ви можете написати щось на кшталт .... <input type="radio" [checked]="condition">Значення умови повинно бути істинним або хибним.

Також для атрибутів стилю ... <h4 [style.color]="'red'">Some text</h4>


4

ви можете використовувати це.

<span [attr.checked]="val? true : false"> </span>


Ви перевірили значення атрибута "val". якщо воно стає істинним, то просто true повертає інакше помилкове повернення значення
WapShivam

1

Можна скористатися кращим підходом для того, щоб хтось писав HTML для вже наявного scss.
html

[attr.role]="<boolean>"

scss

[role = "true"] { ... }

Таким чином вам не потрібно <boolean> ? true : nullкожен раз.


Це працює не в кожному випадку. Наприклад, він не працює з multipleатрибутом на selectелементі.
smartmouse


0

Я хотів мати підказку лише для певного поля, як додано нижче в коді, але ви хочете мати підказку на multiplent, ви можете мати валідату масиву, використовуючи:

Кілька елементів, що мають спеціальний атрибут datatip tooltip :

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Включає (ключ)

2: ['key1ToHaveTooltip', 'key2ToHaveTooltip']. IndexOf (key)> -1

мати атрибут підказки для більш ніж 1 елемента.

   <div *ngFor="let key of Keys"
             [attr.data-tooltip]="key === 'IwantOnlyThisKeyToHaveTooltipAttribute' 
                                           ? 'Hey! I am a tooltip on key matched'
                                           : null">
   </div>

-7

Inline-карти теж зручні.

Вони також трохи чіткіші та зручніші для читання.

[class]="{ 'true': 'active', 'false': 'inactive', 'true&false': 'some-other-class' }[ trinaryBoolean ]"

Ще один спосіб досягти того ж, якщо вам не подобається потрійний синтаксис або ngIfs (тощо).


1
Клас - це щось зовсім інше, ніж атрибут (про що йдеться в питанні)
Günter Zöchbauer

1
Ви також можете докласти зусиль, щоб зробити це правильною відповіддю на питання, тоді у мене було підстави переглянути свій голос, і я також міг подати заяву, не додаючи коментарів, щоб не зважати на те, для чого був голосуванням.
Günter Zöchbauer

1
@Cody чи можете ви пояснити (навести приклад коду), як ваш метод буде працювати з checkedатрибутом (додавати / видаляти його з тегу введення) <input type="checkbox" name="vehicle" value="Car" checked>? (Якщо ми змінимо classдо checkboxв вашому коді не працює (я перевірити це))
Каміль Kiełczewski
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.