Как добавить условный атрибут в Angular 2?

276

Как я могу условно добавить атрибут элемента, например checked, флажок?

Предыдущие версии Angular были, NgAttrи я думаю, NgCheckedчто все они обеспечивают функциональность, которая мне нужна. Однако эти атрибуты, по-видимому, не существуют в Angular 2, и я не вижу другого способа обеспечить эту функциональность.

Джонатан Майлз
источник
1
Смотрите также: stackoverflow.com/questions/36240736/…
Мэтти
См. Также: stackoverflow.com/questions/42179150/…
aloisdg переходит на codidact.com
2
googlers, если вам нужен атрибут без значения для углового компонента, см. здесь
Фрэнк

Ответы:

574

null удаляет это:

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

или

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

Подсказка:

Атрибут против свойства

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

Смотрите также В чем разница между свойствами и атрибутами в HTML?

С чем связываться, когда такого свойства нет

Альтернативы [style.xxx]="...", [attr.xxx]="...", в [class.xxx]="..."зависимости от того, что вы пытаетесь достичь.

Потому что <input>имеет только checkedатрибут, но никакое checkedсвойство не [attr.checked]="..."является правильным способом для этого конкретного случая.

Атрибуты могут обрабатывать только строковые значения

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

Большинство свойств и атрибутов элементов связаны и имеют одинаковые имена.

Свойство-связь атрибута

При привязке к атрибуту свойство также получает только строковое значение из атрибута.
При связывании со свойством свойство получает привязанное к нему значение (логическое значение, число, объект, ...), а атрибут снова получает строковое значение.

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

С тех пор Angular был изменен и знает об этих особых случаях и обрабатывает их, так что вы можете связываться с ними, <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 Ну, я использую Ng 4.x, и <a [href]="item.href">где значение item.hrefundefined (не значение undefined, но свойство 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
о человек, это: ноль удивителен, штука знала, что это можно использовать в условных выражениях! спасибо за решение.
Пинарелла
17

Уточняющий ответ Гюнтера Цохбауэра:

Похоже, сейчас все по-другому. Я пытался сделать это, чтобы условно применить атрибут href к тегу привязки. Вы должны использовать undefined для случая «не применять». В качестве примера я продемонстрирую со ссылкой, условно применяя атрибут href.

Якорный тег без атрибута href становится простым текстом, указывающим местозаполнитель для ссылки, согласно спецификации гиперссылки .

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

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

Думаю, это чище, чем использование двух * ngIf для тега span и anchor.

Ragnaraxis
источник
5

Если это элемент ввода, вы можете написать что-то вроде .... <input type="radio" [checked]="condition"> Значение условия должно быть истинным или ложным.

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

Рохит Тирманвар
источник
4

Вы можете использовать это.

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

WapShivam
источник
Вы проверили значение своего атрибута с помощью 'val'. если оно становится истинным, тогда просто true возвращает в противном случае ложное возвращение значения
WapShivam
1

Вы можете использовать лучший подход для тех, кто пишет HTML для уже существующих scss.
HTML

[attr.role]="<boolean>"

СКС

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

Таким образом, вам не нужно <boolean> ? true : nullкаждый раз.

Жоао Гигнатти
источник
Это не работает в каждом случае. Например, он не работает с multipleатрибутом selectэлемента.
smartmouse
0

Здесь, абзац печатается только 'isValid' является истинным / он содержит любое значение

<p *ngIf="isValid ? true : false">Paragraph</p>
Айшвария Катхавараян
источник
0

Я хотел иметь всплывающую подсказку только для определенного поля, как добавлено ниже в коде, но вы хотите иметь всплывающую подсказку для мультиплета, вы можете иметь массив valdidate, используя:

Несколько элементов, имеющих собственный атрибут data-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-Maps тоже удобны.

Они немного более четкие и читабельные.

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

Просто еще один способ выполнить то же самое, если вам не нравится троичный синтаксис или ngIfs (и т. Д.).

Cody
источник
1
Класс - это нечто совершенно иное, чем атрибут (о чем вопрос)
Гюнтер Цохбауэр
1
Вы также можете приложить усилия, чтобы сделать правильный ответ на вопрос, тогда у меня была причина пересмотреть свой голос, и я также мог бы отказаться от голосования, не добавив комментарий, чтобы держать вас в неведении относительно того, для чего было понижающее голосование.
Гюнтер Цохбауэр
1
@ Кто-нибудь может объяснить (приведите пример кода), как ваш метод будет работать с checkedатрибутом (добавить / удалить его из входного тега) <input type="checkbox" name="vehicle" value="Car" checked>? (если мы изменим classна checkboxваш код, он НЕ работает (я проверяю это))
Kamil Kiełczewski