¿Cómo agregar un atributo condicional en Angular 2?

276

¿Cómo puedo agregar condicionalmente un atributo de elemento, por ejemplo, el checkedde una casilla de verificación?

Las versiones anteriores de Angular tenían NgAttry creo NgCheckedque todas parecen proporcionar la funcionalidad que busco. Sin embargo, estos atributos no parecen existir en Angular 2 y no veo otra forma de proporcionar esta funcionalidad.

Jonathan Miles
fuente
Consulte también: stackoverflow.com/questions/42179150/…
aloisdg se muda a codidact.com el
2
googlers, en caso de que desee un atributo sin valor para un componente angular, consulte aquí
Frank Nocke

Respuestas:

574

null lo quita:

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

o

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

Insinuación:

Atributo vs propiedad

Cuando el elemento HTML donde agrega este enlace no tiene una propiedad con el nombre utilizado en el enlace ( checkeden este caso) y tampoco se aplica ningún componente angular o directiva al mismo elemento que tiene un @Input() checked;, entonces [xxx]="..."no se puede usar.

Consulte también ¿Cuál es la diferencia entre propiedades y atributos en HTML?

A qué unirse cuando no existe tal propiedad

Las alternativas son [style.xxx]="...", [attr.xxx]="...", [class.xxx]="..."dependiendo de lo que intenta lograr.

Porque <input>solo tiene un checkedatributo, pero ninguna checkedpropiedad [attr.checked]="..."es la forma correcta para este caso específico.

Los atributos solo pueden manejar valores de cadena

Una trampa común también es que para los [attr.xxx]="..."enlaces el valor ( ...) siempre está en cadena. Solo las propiedades @Input()ys pueden recibir otros tipos de valores como booleano, número, objeto, ...

La mayoría de las propiedades y atributos de los elementos están conectados y tienen el mismo nombre.

Conexión de propiedad-atributo

Cuando está vinculada al atributo, la propiedad solo recibe el valor en cadena del atributo.
Cuando se vincula a la propiedad, la propiedad recibe el valor vinculado a ella (booleano, número, objeto, ...) y el atributo nuevamente el valor en cadena.

Dos casos en los que los nombres de atributos y propiedades no coinciden.

Angular se modificó desde entonces y conoce estos casos especiales y los maneja para que pueda vincularlos <label [for]="aunque no exista dicha propiedad (lo mismo para colspan)

Günter Zöchbauer
fuente
3
Puede omitir el "attr". prefijo.
Filip Stachowiak
16
@FilipStachowiak, entonces no se convertirá en un atributo. Hay varias propiedades en muchos elementos donde el elemento en sí refleja el valor vinculado a una propiedad de un atributo (y también en la otra dirección). En este caso no lo necesitas attr.. Pero si desea agregar un atributo personalizado, definitivamente necesita el attr.prefijo
Günter Zöchbauer
14
Para ser claro, necesitas la attr.parte de esto. Estaba tratando de configurar [href]y solo quería que se configurara si hrefexistía la propiedad del elemento . Sin [attr.href]esto, se agregaría un href con un valor de 'nulo', que, al hacer clic, actualizaría la página actual. [attr.href]arreglado.
dudewad
@dudewad que no me suena bien. Si configura hrefun elemento que tiene la hrefpropiedad, no hay necesidad de usarlo attr. Debe haber algo más que salió mal.
Günter Zöchbauer
@ günter-zöchbauer Bueno, estoy usando Ng 4.x, y <a [href]="item.href">donde item.hrefestá indefinido (no el valor indefinido, pero la propiedad hrefno existe item) estaba estableciendo el hrefatributo null. No profundicé en la fuente, porque honestamente no me importa mucho en este momento (este es un pequeño detalle), pero attr.es una directiva completamente diferente y, por lo tanto, actuar de manera diferente no me sorprende.
dudewad
37

en la sintaxis del atributo angular-2 es

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

Vincula el rol de atributo al resultado de la expresión myAriaRole.

así que puede usar como

[attr.role]="myAriaRole ? true: null"
Shaishab Roy
fuente
9
El problema aquí es que cuando your expressionse falseverá el atributo en el DOM <div checked="false">. No creo que este sea el efecto deseado.
Günter Zöchbauer
77
Gracias, pero pregunté cómo agregar condicionalmente el atributo, no asignar condicionalmente su valor.
Jonathan Miles
Incluso puedes omitir el "attr". prefijo.
Filip Stachowiak
1
@FilipStachowiak, entonces no se convertirá en un atributo. Hay varias propiedades en muchos elementos donde el elemento en sí refleja el valor vinculado a una propiedad de un atributo (y también en la otra dirección). En este caso no lo necesitas attr.. Pero si desea agregar un atributo personalizado, definitivamente necesita el attr.prefijo
Günter Zöchbauer
oh hombre, esto: nulo es increíble, ¡sabía que esto se puede usar en condicional! Gracias por la solución.
pinarella
17

Refinando la respuesta de Günter Zöchbauer:

Esto parece ser diferente ahora. Estaba tratando de hacer esto para aplicar condicionalmente un atributo href a una etiqueta de anclaje. Debe usar undefined para el caso 'no aplicar'. Como ejemplo, demostraré con un enlace que tiene un atributo href aplicado condicionalmente.

Una etiqueta de anclaje sin un atributo href se convierte en texto sin formato, lo que indica un marcador de posición para un enlace, según la especificación del hipervínculo .

Para mi navegación, tengo una lista de enlaces, pero uno de esos enlaces representa la página actual. No quería que el enlace de la página actual fuera un enlace, pero todavía quiero que aparezca en la lista (tiene algunos estilos personalizados, pero este ejemplo está simplificado).

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

Esto es más limpio que usar dos * ngIf en una etiqueta de intervalo y ancla, creo.

Ragnaraxis
fuente
5

Si es un elemento de entrada, puede escribir algo como ... <input type="radio" [checked]="condition">El valor de la condición debe ser verdadero o falso.

También para atributos de estilo ... <h4 [style.color]="'red'">Some text</h4>

Rohit Tirmanwar
fuente
4

Puedes usar esto.

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

WapShivam
fuente
Verificó el valor de su atributo con 'val'. si se vuelve verdadero, simplemente devuelve verdadero, de lo contrario, devuelve valor falso
WapShivam
1

Puede utilizar un mejor enfoque para alguien que escriba HTML para un scss ya existente.
html

[attr.role]="<boolean>"

scss

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

De esa manera no es necesario <boolean> ? true : nullcada vez.

João Ghignatti
fuente
Esto no funciona en todos los casos. Por ejemplo, no funciona con multipleatributo en selectelemento.
smartmouse
0

Aquí, el párrafo se imprime solo 'isValid' es verdadero / contiene cualquier valor

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

Quería tener información sobre herramientas solo para un campo en particular, como se agrega a continuación en el código, pero desea tener información sobre herramientas en múltiples, puede tener una matriz validar usando:

Elementos múltiples que tienen un atributo personalizado de información sobre herramientas :

1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Incluye (clave)

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

tener un atributo de información sobre herramientas en más de 1 elemento.

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

Los mapas en línea también son útiles.

También son un poco más explícitos y legibles.

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

Solo otra forma de lograr lo mismo, en caso de que no le guste la sintaxis ternaria o ngIfs (etc.).

Cody
fuente
1
Una clase es algo completamente diferente a un atributo (de qué se trata la pregunta)
Günter Zöchbauer
1
También podría tomar el esfuerzo de hacer una respuesta adecuada a la pregunta, entonces tuve una razón para reconsiderar mi voto y también podría haber votado negativamente sin agregar un comentario para mantenerlo en la oscuridad sobre para qué era el voto negativo.
Günter Zöchbauer
1
@Cody, ¿puede explicar (dar un código de ejemplo) cómo funcionará su método con el checkedatributo (agregar / eliminar de la etiqueta de entrada) <input type="checkbox" name="vehicle" value="Car" checked>? (si cambiamos classa checkboxsu código no funciona (me mira esto))
Kamil Kielczewski