Como posso adicionar condicionalmente um atributo de elemento, por exemplo, o checked
caixa de seleção?
Versões anteriores do Angular tinham NgAttr
e acho NgChecked
que todas parecem fornecer a funcionalidade que eu estou procurando. No entanto, esses atributos não parecem existir no Angular 2 e não vejo outra maneira de fornecer essa funcionalidade.
javascript
angular
Jonathan Miles
fonte
fonte
Respostas:
null
remove:ou
Dica:
Atributo vs propriedade
Quando o elemento HTML ao qual você adiciona essa ligação não possui uma propriedade com o nome usado na ligação (
checked
nesse caso) e também nenhum componente ou diretiva Angular é aplicada ao mesmo elemento que possui uma@Input() checked;
,[xxx]="..."
não pode ser usada.Veja também Qual é a diferença entre propriedades e atributos em HTML?
A que vincular quando não existe essa propriedade
As alternativas são
[style.xxx]="..."
,[attr.xxx]="..."
,[class.xxx]="..."
dependendo do que você tentar realizar.Porque
<input>
só tem umchecked
atributo, mas nenhumachecked
propriedade[attr.checked]="..."
é o caminho certo para este caso específico.Os atributos podem lidar apenas com valores de sequência
Uma armadilha comum também é que, para as
[attr.xxx]="..."
ligações, o valor (...
) é sempre rigoroso. Somente propriedades e@Input()
es podem receber outros tipos de valores como booleano, número, objeto, ...A maioria propriedades e atributos dos elementos estão conectados e têm o mesmo nome.
Conexão de atributo de propriedade
Quando ligada ao atributo, a propriedade também recebe apenas o valor stringified do atributo.
Quando ligada à propriedade, a propriedade recebe o valor associado a ela (booleano, número, objeto, ...) e o atributo novamente o valor estrito.
Dois casos em que os nomes de atributos e propriedades não coincidem.
https://developer.mozilla.org/pt-BR/docs/Web/API/HTMLLabelElement/htmlFor (consulte a primeira frase da descrição
htmlFor property reflects the value of the for
-for
provavelmente não funcionou porque é uma palavra-chave em C ou JavaScript)Por que colspan não é um atributo nativo conhecido no Angular 2?
Angular foi alterado desde então e conhece esses casos especiais e os manipula para que você possa vincular-se a ele
<label [for]="
mesmo que não exista essa propriedade (o mesmo paracolspan
)fonte
attr.
. Mas se você quiser adicionar um atributo personalizado, você definitivamente precisa doattr.
prefixoattr.
parte disso. Eu estava tentando definir[href]
e só queria que fosse definido se ahref
propriedade do item existisse. Sem[attr.href]
isso, adicionaria um href com o valor 'null' que, ao ser clicado, atualizaria a página atual.[attr.href]
consertou.href
um elemento que possui ahref
propriedade, não há necessidade de usarattr
. Deve haver algo mais errado.<a [href]="item.href">
ondeitem.href
está indefinido (não o valor indefinido, mas a propriedadehref
não existeitem
) estava definindo ohref
atributo comonull
. Não mergulhei na fonte, porque sinceramente não me importo muito neste momento (esse é um pequeno detalhe), masattr.
é uma diretiva completamente diferente e, portanto, agir de forma diferente não me surpreende.na sintaxe do atributo angular-2 é
Vincula a função de atributo ao resultado da expressão myAriaRole.
então pode usar como
fonte
your expression
seráfalse
o atributo no DOM será semelhante<div checked="false">
. Não acho que esse seja o efeito pretendido.attr.
. Mas se você quiser adicionar um atributo personalizado, você definitivamente precisa doattr.
prefixoRefinando a resposta de Günter Zöchbauer:
Isso parece ser diferente agora. Eu estava tentando fazer isso para aplicar condicionalmente um atributo href a uma marca de âncora. Você deve usar indefinido para o caso 'não se aplica'. Como exemplo, demonstrarei com um link condicionalmente a aplicação de um atributo href.
Uma marca de âncora sem um atributo href se torna texto sem formatação, indicando um espaço reservado para um link, de acordo com a especificação do hiperlink .
Para minha navegação, tenho uma lista de links, mas um desses links representa a página atual. Eu não queria que o link da página atual fosse um link, mas ainda quero que ele apareça na lista (ele tem alguns estilos personalizados, mas este exemplo é simplificado).
Isso é mais limpo do que usar dois * ngIf em uma tag span e anchor, eu acho.
fonte
Se for um elemento de entrada, você pode escrever algo como ....
<input type="radio" [checked]="condition">
O valor da condição deve ser verdadeiro ou falso.Também para atributos de estilo ...
<h4 [style.color]="'red'">Some text</h4>
fonte
Você pode usar isso.
<span [attr.checked]="val? true : false"> </span>
fonte
Você pode usar uma abordagem melhor para alguém escrever HTML para um scss já existente.
html
scss
Dessa forma, você não precisa
<boolean> ? true : null
sempre.fonte
multiple
atributo noselect
elemento.Aqui, o parágrafo é impresso apenas 'isValid' é verdadeiro / contém qualquer valor
fonte
Eu queria ter uma dica de ferramenta apenas para um campo específico, conforme adicionado abaixo no código, mas você deseja ter uma dica de ferramenta no multiplente, pode ter um array valdidate usando:
Vários elementos com atributo de dica de ferramenta de dados personalizado :
1: [ 'key1ToHaveTooltip', `key2ToHaveTooltip ']. Inclui (chave)
2: ['key1ToHaveTooltip', 'key2ToHaveTooltip']. IndexOf (key)> -1
ter atributo de dica de ferramenta em mais de 1 elemento.
fonte
Mapas em linha também são úteis.
Eles são um pouco mais explícitos e legíveis também.
Apenas outra maneira de realizar a mesma coisa, caso você não goste da sintaxe ternária ou
ngIf
s (etc).fonte
checked
atributo (adicione / remova-o da tag de entrada)<input type="checkbox" name="vehicle" value="Car" checked>
? (se mudarclass
paracheckbox
em seu código que não funciona (eu verificar isso))