Come aggiungere l'attributo condizionale in Angular 2?


276

Come posso aggiungere condizionalmente un attributo element, ad es. Di checkeduna casella di controllo?

Le versioni precedenti di Angular avevano NgAttre penso NgCheckedche tutte sembrano fornire la funzionalità che sto cercando. Tuttavia, questi attributi non sembrano esistere in Angular 2 e non vedo altro modo di fornire questa funzionalità.




2
googler, nel caso in cui si desideri un attributo senza valore per un componente angolare, vedere qui
Frank Nocke,

Risposte:


574

null lo rimuove:

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

o

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

Suggerimento:

Attributo vs proprietà

Quando l'elemento HTML in cui si aggiunge questa associazione non ha una proprietà con il nome utilizzato nell'associazione ( checkedin questo caso) e anche nessun componente angolare o direttiva viene applicato allo stesso elemento che ha un @Input() checked;, quindi [xxx]="..."non può essere utilizzato.

Vedi anche Qual è la differenza tra proprietà e attributi in HTML?

Cosa legare quando non esiste tale proprietà

Le alternative sono [style.xxx]="...", [attr.xxx]="...", [class.xxx]="..."a seconda di ciò che si tenta di realizzare.

Perché <input>ha solo un checkedattributo, ma nessuna checkedproprietà [attr.checked]="..."è la strada giusta per questo caso specifico.

Gli attributi possono gestire solo valori di stringa

Una trappola comune è anche che per i [attr.xxx]="..."bind il valore ( ...) è sempre rigoroso. Solo le proprietà @Input()possono ricevere altri tipi di valore come booleano, numero, oggetto, ...

La maggior parte delle proprietà e degli attributi degli elementi sono collegati e hanno lo stesso nome.

Connessione proprietà-attributo

Se associata all'attributo, la proprietà riceve anche solo il valore specificato dall'attributo.
Se associata alla proprietà, la proprietà riceve il valore associato ad essa (booleano, numero, oggetto, ...) e l'attributo di nuovo il valore stringa.

Due casi in cui i nomi degli attributi e delle proprietà non corrispondono.

Da allora l'angolo è stato modificato e conosce questi casi speciali e li gestisce in modo da poterli associare <label [for]="anche se non esiste tale proprietà (lo stesso per colspan)


3
Puoi omettere "attr." prefisso.
Filip Stachowiak,

16
@FilipStachowiak quindi non diventerà un attributo. Esistono varie proprietà su molti elementi in cui l'elemento stesso riflette il valore associato a una proprietà a un attributo (e anche all'altra direzione). In questo caso non è necessario attr.. Ma se vuoi aggiungere un attributo personalizzato, hai sicuramente bisogno del attr.prefisso
Günter Zöchbauer,

14
Per essere chiari, è necessaria la attr.parte di questo. Stavo cercando di impostare [href]e volevo che fosse impostato solo se hrefesistesse la proprietà dell'oggetto . Senza [attr.href]questo aggiungerebbe un href con un valore di 'null', che, se cliccato, aggiornerebbe la pagina corrente. [attr.href]aggiustato.
Dudewad,

@dudewad che non suona bene per me. Se si imposta hrefun elemento con la hrefproprietà, non è necessario utilizzarlo attr. Deve esserci qualcos'altro che non ha funzionato.
Günter Zöchbauer,

@ günter-zöchbauer Bene, sto usando Ng 4.x, e <a [href]="item.href">dove item.hrefnon è definito (non il valore non è definito, ma la proprietà hrefnon esiste su item) stava impostando l' hrefattributo su null. Non ho approfondito la fonte, perché onestamente non mi interessa molto a questo punto (questo è un piccolo dettaglio), ma attr.è una direttiva completamente diversa e quindi agire in modo diverso non mi sorprende.
Dudewad,

37

nella sintassi dell'attributo angolare-2 è

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

Associa il ruolo dell'attributo al risultato dell'espressione myAriaRole.

così può usare come

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

9
Il problema qui è che quando your expressionè falsel'attributo nel DOM sarà simile <div checked="false">. Non penso che questo sia l'effetto desiderato.
Günter Zöchbauer,

7
Grazie, ma ho chiesto come aggiungere condizionalmente l'attributo, non assegnare condizionalmente il suo valore.
Jonathan Miles,

Puoi persino omettere "attr." prefisso.
Filip Stachowiak,

1
@FilipStachowiak quindi non diventerà un attributo. Esistono varie proprietà su molti elementi in cui l'elemento stesso riflette il valore associato a una proprietà a un attributo (e anche all'altra direzione). In questo caso non è necessario attr.. Ma se vuoi aggiungere un attributo personalizzato, hai sicuramente bisogno del attr.prefisso
Günter Zöchbauer,

oh amico, questo: null è incredibile, la cosa sapeva che questo può essere usato in condizioni! grazie per la soluzione.
Pinarella

17

Raffinazione Günter Zöchbauer risposta:

Questo sembra essere diverso ora. Stavo cercando di fare questo per applicare condizionalmente un attributo href a un tag anchor. È necessario utilizzare undefined per il caso 'non applicare'. Ad esempio, dimostrerò in modo condizionale un link a cui è applicato un attributo href.

Un tag anchor senza un attributo href diventa testo semplice, indicando un segnaposto per un collegamento, secondo la specifica del collegamento ipertestuale .

Per la mia navigazione, ho un elenco di collegamenti, ma uno di questi collegamenti rappresenta la pagina corrente. Non volevo che il link della pagina corrente fosse un link, ma volevo comunque che comparisse nell'elenco (ha alcuni stili personalizzati, ma questo esempio è semplificato).

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

Questo è più pulito dell'uso di due * ngIf su uno span e tag di ancoraggio, credo.


5

Se è un elemento di input, puoi scrivere qualcosa del tipo ... <input type="radio" [checked]="condition">Il valore della condizione deve essere vero o falso.

Anche per gli attributi di stile ... <h4 [style.color]="'red'">Some text</h4>


4

puoi usare questo.

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


Hai controllato il valore del tuo attributo con 'val'. se diventa vero, semplicemente true restituisce il valore falso return
WapShivam

1

Puoi usare un approccio migliore per qualcuno che scrive HTML per uno scss già esistente.
html

[attr.role]="<boolean>"

SCSS

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

In questo modo non è necessario <boolean> ? true : nullogni volta.


Questo non funziona in ogni caso. Ad esempio, non funziona con l' multipleattributo selectsull'elemento.
smartmouse,

0

Qui, il paragrafo viene stampato solo 'isValid' è true / contiene qualsiasi valore

<p *ngIf="isValid ? true : false">Paragraph</p>

0

Volevo avere tooltip solo per un determinato campo come aggiunto di seguito nel codice ma vuoi avere tooltip su multiplent puoi avere un array valdidate usando:

Più elementi con attributo personalizzato data-tooltip :

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Include (chiave)

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

avere l'attributo tooltip su più di 1 elemento.

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

-7

Anche le mappe in linea sono utili.

Sono anche un po 'più espliciti e leggibili.

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

Solo un altro modo di realizzare la stessa cosa, nel caso in cui non ti piaccia la sintassi ternaria o ngIfs (ecc.).


1
Una classe è qualcosa di completamente diverso da un attributo (di cosa tratta la domanda)
Günter Zöchbauer,

1
Potresti anche fare lo sforzo di renderlo una risposta adeguata alla domanda, quindi ho avuto un motivo per riconsiderare il mio voto e avrei anche potuto effettuare il downgrade senza aggiungere un commento per tenerti al buio su ciò che il downvote era destinato.
Günter Zöchbauer,

1
@Cody puoi spiegare (dare un esempio di codice) come funzionerà il tuo metodo con l' checkedattributo (aggiungerlo / rimuoverlo dal tag di input) in <input type="checkbox" name="vehicle" value="Car" checked>? (se cambiamo classa checkboxnel codice non funziona (I check this))
Kamil Kielczewski
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.