Comment ajouter un attribut conditionnel dans Angular 2?

276

Comment puis-je ajouter conditionnellement un attribut d'élément, par exemple celui checkedd'une case à cocher?

Les versions précédentes d'Angular avaient NgAttret je pense NgCheckedque toutes semblent fournir les fonctionnalités que je recherche. Cependant, ces attributs ne semblent pas exister dans Angular 2 et je ne vois aucun autre moyen de fournir cette fonctionnalité.

Jonathan Miles
la source
Voir aussi: stackoverflow.com/questions/42179150/…
aloisdg passe à codidact.com
2
googlers, au cas où vous voudriez un attribut sans valeur à un composant angulaire, voir ici
Frank Nocke

Réponses:

574

null le supprime:

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

ou

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

Allusion:

Attribut vs propriété

Lorsque l'élément HTML auquel vous ajoutez cette liaison n'a pas de propriété avec le nom utilisé dans la liaison ( checkeddans ce cas) et qu'aucun composant ou directive angulaire n'est appliqué au même élément qui a un @Input() checked;, alors [xxx]="..."ne peut pas être utilisé.

Voir aussi Quelle est la différence entre les propriétés et les attributs en HTML?

À quoi se lier quand il n'y a pas une telle propriété

Les alternatives sont [style.xxx]="...", [attr.xxx]="...", en [class.xxx]="..."fonction de ce que vous essayez d'accomplir.

Parce qu'il <input>n'a qu'un checkedattribut, mais aucune checkedpropriété [attr.checked]="..."n'est la bonne façon pour ce cas spécifique.

Les attributs ne peuvent gérer que des valeurs de chaîne

Un écueil courant est également que pour les [attr.xxx]="..."liaisons, la valeur ( ...) est toujours chaîne. Seules les propriétés et les @Input()s peuvent recevoir d'autres types de valeurs comme booléen, nombre, objet, ...

La plupart des propriétés et attributs des éléments sont connectés et portent le même nom.

Connexion d'attribut de propriété

Lorsqu'elle est liée à l'attribut, la propriété ne reçoit également que la valeur chaîne de l'attribut.
Lorsqu'elle est liée à la propriété, la propriété reçoit la valeur qui lui est liée (booléen, nombre, objet, ...) et l'attribut à nouveau la valeur chaîne.

Deux cas où les noms d'attribut et de propriété ne correspondent pas.

L'angulaire a été modifié depuis et connaît ces cas spéciaux et les gère pour que vous puissiez vous lier <label [for]="même si aucune propriété de ce type n'existe (idem pour colspan)

Günter Zöchbauer
la source
3
Vous pouvez omettre le "attr". préfixe.
Filip Stachowiak
16
@FilipStachowiak alors il ne deviendra pas un attribut. Il existe différentes propriétés sur de nombreux éléments où l'élément lui-même reflète la valeur liée à une propriété à un attribut (et également dans l'autre sens). Dans ce cas, vous n'en avez pas besoin attr.. Mais si vous voulez ajouter un attribut personnalisé, vous avez certainement besoin du attr.préfixe
Günter Zöchbauer
14
Pour être clair, vous avez besoin de la attr.partie de cela. J'essayais de définir [href]et je voulais seulement qu'il soit défini si la hrefpropriété de l'élément existait. Sans [attr.href]cela ajouterait un href avec une valeur de 'null', qui, une fois cliqué, rafraîchirait la page actuelle. [attr.href]l'a corrigé.
dudewad
@dudewad qui ne me semble pas juste. Si vous définissez hrefun élément qui a la hrefpropriété, il n'est pas nécessaire de l'utiliser attr. Il doit y avoir autre chose qui a mal tourné.
Günter Zöchbauer
@ günter-zöchbauer Eh bien, j'utilise Ng 4.x, et <a [href]="item.href">item.hrefest indéfini (pas la valeur indéfinie, mais la propriété hrefn'existe pas item) définissait l' hrefattribut sur null. Je ne me suis pas plongé dans la source, car honnêtement, je ne m'inquiète pas beaucoup à ce stade (c'est un petit détail), mais attr.c'est une directive complètement différente et donc agir différemment ne me surprend pas.
dudewad
37

dans la syntaxe d'attribut angular-2 est

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

Lie le rôle d'attribut au résultat de l'expression myAriaRole.

peut donc utiliser comme

[attr.role]="myAriaRole ? true: null"
Shaishab Roy
la source
9
Le problème ici est que quand your expressionest falsel'attribut dans le DOM ressemblera <div checked="false">. Je ne pense pas que ce soit l'effet escompté.
Günter Zöchbauer
7
Merci, mais j'ai demandé comment ajouter conditionnellement l'attribut, et non affecter conditionnellement sa valeur.
Jonathan Miles
Vous pouvez même omettre le "attr". préfixe.
Filip Stachowiak
1
@FilipStachowiak alors il ne deviendra pas un attribut. Il existe différentes propriétés sur de nombreux éléments où l'élément lui-même reflète la valeur liée à une propriété à un attribut (et également dans l'autre sens). Dans ce cas, vous n'en avez pas besoin attr.. Mais si vous voulez ajouter un attribut personnalisé, vous avez certainement besoin du attr.préfixe
Günter Zöchbauer
oh man, ceci: null est incroyable, chose savait que cela peut être utilisé au conditionnel! merci pour la solution.
pinarella
17

Affiner la réponse de Günter Zöchbauer:

Cela semble être différent maintenant. J'essayais de faire cela pour appliquer conditionnellement un attribut href à une balise d'ancrage. Vous devez utiliser undefined pour le cas «ne s'applique pas». À titre d'exemple, je vais démontrer avec un lien ayant conditionnellement un attribut href appliqué.

Une balise d'ancrage sans attribut href devient du texte brut, indiquant un espace réservé pour un lien, selon les spécifications du lien hypertexte .

Pour ma navigation, j'ai une liste de liens, mais l'un de ces liens représente la page actuelle. Je ne voulais pas que le lien de la page actuelle soit un lien, mais je veux quand même qu'il apparaisse dans la liste (il a des styles personnalisés, mais cet exemple est simplifié).

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

C'est plus propre que d'utiliser deux * ngIf sur une balise span et d'ancrage, je pense.

Ragnaraxis
la source
5

S'il s'agit d'un élément d'entrée, vous pouvez écrire quelque chose comme .... <input type="radio" [checked]="condition">La valeur de condition doit être vraie ou fausse.

Aussi pour les attributs de style ... <h4 [style.color]="'red'">Some text</h4>

Rohit Tirmanwar
la source
4

vous pouvez l'utiliser.

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

WapShivam
la source
Vous avez vérifié la valeur de votre attribut avec 'val'. si cela devient vrai, alors simplement vrai renvoie sinon retourne une valeur fausse
WapShivam
1

Vous pouvez utiliser une meilleure approche pour quelqu'un qui écrit du HTML pour un scss déjà existant.
html

[attr.role]="<boolean>"

scss

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

De cette façon, vous n'en avez pas besoin à <boolean> ? true : nullchaque fois.

João Ghignatti
la source
Cela ne fonctionne pas dans tous les cas. Par exemple, cela ne fonctionne pas avec l' multipleattribut sur l' selectélément.
smartmouse
0

Ici, le paragraphe est imprimé uniquement «isValid» est vrai / il contient n'importe quelle valeur

<p *ngIf="isValid ? true : false">Paragraph</p>
Aishwarya Kathavarayan
la source
0

Je voulais avoir une info-bulle uniquement pour un champ particulier comme ajouté ci-dessous dans le code, mais vous voulez avoir une info-bulle sur le multiplicateur, vous pouvez avoir un tableau valdidate en utilisant:

Plusieurs éléments ayant un attribut d' info-bulle de données personnalisé :

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Inclut (clé)

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

pour avoir l'attribut info-bulle sur plus d'un élément.

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

Les cartes en ligne sont également pratiques.

Ils sont également un peu plus explicites et lisibles.

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

Juste une autre façon d'accomplir la même chose, au cas où vous n'aimeriez pas la syntaxe ternaire ou ngIfs (etc).

Cody
la source
1
Une classe est quelque chose de complètement différent d'un attribut (de quoi s'agit-il)
Günter Zöchbauer
1
Vous pourriez également prendre l'effort de faire une bonne réponse à la question, puis j'avais une raison de reconsidérer mon vote et j'aurais également pu voter en baisse sans ajouter de commentaire pour vous garder dans l'ignorance de ce que le downvote était.
Günter Zöchbauer
1
@Cody pouvez-vous expliquer (donner un exemple de code) comment votre méthode fonctionnera avec l' checkedattribut (ajoutez / supprimez-le de la balise d'entrée) dans <input type="checkbox" name="vehicle" value="Car" checked>? (si nous changeons classen checkboxdans votre code cela ne fonctionne pas (je vérifie cela))
Kamil Kiełczewski