¿Cómo puedo agregar condicionalmente un atributo de elemento, por ejemplo, el checked
de una casilla de verificación?
Las versiones anteriores de Angular tenían NgAttr
y creo NgChecked
que 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.
javascript
angular
Jonathan Miles
fuente
fuente
Respuestas:
null
lo quita:o
Insinuación:
Atributo vs propiedad
Cuando el elemento HTML donde agrega este enlace no tiene una propiedad con el nombre utilizado en el enlace (
checked
en 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 unchecked
atributo, pero ningunachecked
propiedad[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.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/htmlFor (vea la primera oración de la descripción
htmlFor property reflects the value of the for
,for
probablemente no funcionó porque es una palabra clave en C o JavaScript)¿Por qué colspan no es un atributo nativo conocido en Angular 2?
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 paracolspan
)fuente
attr.
. Pero si desea agregar un atributo personalizado, definitivamente necesita elattr.
prefijoattr.
parte de esto. Estaba tratando de configurar[href]
y solo quería que se configurara sihref
existí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.href
un elemento que tiene lahref
propiedad, no hay necesidad de usarloattr
. Debe haber algo más que salió mal.<a [href]="item.href">
dondeitem.href
está indefinido (no el valor indefinido, pero la propiedadhref
no existeitem
) estaba estableciendo elhref
atributonull
. No profundicé en la fuente, porque honestamente no me importa mucho en este momento (este es un pequeño detalle), peroattr.
es una directiva completamente diferente y, por lo tanto, actuar de manera diferente no me sorprende.en la sintaxis del atributo angular-2 es
Vincula el rol de atributo al resultado de la expresión myAriaRole.
así que puede usar como
fuente
your expression
sefalse
verá el atributo en el DOM<div checked="false">
. No creo que este sea el efecto deseado.attr.
. Pero si desea agregar un atributo personalizado, definitivamente necesita elattr.
prefijoRefinando 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).
Esto es más limpio que usar dos * ngIf en una etiqueta de intervalo y ancla, creo.
fuente
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>
fuente
Puedes usar esto.
<span [attr.checked]="val? true : false"> </span>
fuente
Puede utilizar un mejor enfoque para alguien que escriba HTML para un scss ya existente.
html
scss
De esa manera no es necesario
<boolean> ? true : null
cada vez.fuente
multiple
atributo enselect
elemento.Aquí, el párrafo se imprime solo 'isValid' es verdadero / contiene cualquier valor
fuente
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.
fuente
Los mapas en línea también son útiles.
También son un poco más explícitos y legibles.
Solo otra forma de lograr lo mismo, en caso de que no le guste la sintaxis ternaria o
ngIf
s (etc.).fuente
checked
atributo (agregar / eliminar de la etiqueta de entrada)<input type="checkbox" name="vehicle" value="Car" checked>
? (si cambiamosclass
acheckbox
su código no funciona (me mira esto))