Como adicionar atributo condicional no Angular 2?

276

Como posso adicionar condicionalmente um atributo de elemento, por exemplo, o checked caixa de seleção?

Versões anteriores do Angular tinham NgAttre acho NgCheckedque 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.

Jonathan Miles
fonte
Veja também: stackoverflow.com/questions/42179150/…
aloisdg movendo-se para codidact.com
2
Googlers, no caso de desejar um atributo de valor menor para um componente angular, veja aqui
Frank Nocke

Respostas:

574

null remove:

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

ou

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

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 ( checkednesse 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 um checkedatributo, mas nenhuma checkedpropriedade[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.

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 para colspan)

Günter Zöchbauer
fonte
3
Você pode omitir o "attr". prefixo.
Filip Stachowiak
16
@FilipStachowiak, ele não se tornará um atributo. Existem várias propriedades em muitos elementos em que o próprio elemento reflete o valor associado a uma propriedade a um atributo (e também a outra direção). Nesse caso, você não precisa attr.. Mas se você quiser adicionar um atributo personalizado, você definitivamente precisa do attr.prefixo
Günter Zöchbauer
14
Para ser claro, você precisa da attr.parte disso. Eu estava tentando definir [href]e só queria que fosse definido se a hrefpropriedade 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.
dudewad
@dudewad que não parece certo para mim. Se você definir hrefum elemento que possui a hrefpropriedade, não há necessidade de usar attr. Deve haver algo mais errado.
Günter Zöchbauer
@ günter-zöchbauer Bem, estou usando a Ng 4.xe <a [href]="item.href">onde item.hrefestá indefinido (não o valor indefinido, mas a propriedade hrefnão existe item) estava definindo o hrefatributo como null. Não mergulhei na fonte, porque sinceramente não me importo muito neste momento (esse é um pequeno detalhe), mas attr.é uma diretiva completamente diferente e, portanto, agir de forma diferente não me surpreende.
dudewad
37

na sintaxe do atributo angular-2 é

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

Vincula a função de atributo ao resultado da expressão myAriaRole.

então pode usar como

[attr.role]="myAriaRole ? true: null"
Shaishab Roy
fonte
9
O problema aqui é que quando your expressionserá falseo atributo no DOM será semelhante <div checked="false">. Não acho que esse seja o efeito pretendido.
Günter Zöchbauer
7
Obrigado, mas eu perguntei como adicionar condicionalmente o atributo, não atribuir condicionalmente seu valor.
Jonathan Miles
Você pode até omitir o "attr". prefixo.
Filip Stachowiak
1
@FilipStachowiak, ele não se tornará um atributo. Existem várias propriedades em muitos elementos em que o próprio elemento reflete o valor associado a uma propriedade a um atributo (e também a outra direção). Nesse caso, você não precisa attr.. Mas se você quiser adicionar um atributo personalizado, você definitivamente precisa do attr.prefixo
Günter Zöchbauer
oh cara, isso: null é incrível, a coisa sabia que isso pode ser usado em condicional! obrigado pela solução.
pinarella 16/03
17

Refinando 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).

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

Isso é mais limpo do que usar dois * ngIf em uma tag span e anchor, eu acho.

Ragnaraxis
fonte
5

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>

Rohit Tirmanwar
fonte
4

Você pode usar isso.

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

WapShivam
fonte
Você verificou o valor do seu atributo com 'val'. se ele fica verdadeiros então simplesmente verdadeiros retornos caso contrário false valor de retorno
WapShivam
1

Você pode usar uma abordagem melhor para alguém escrever HTML para um scss já existente.
html

[attr.role]="<boolean>"

scss

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

Dessa forma, você não precisa <boolean> ? true : nullsempre.

João Ghignatti
fonte
Isso não funciona em todos os casos. Por exemplo, ele não funciona com o multipleatributo no selectelemento.
smartmouse 27/04
0

Aqui, o parágrafo é impresso apenas 'isValid' é verdadeiro / contém qualquer valor

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

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.

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

Mapas em linha também são úteis.

Eles são um pouco mais explícitos e legíveis também.

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

Apenas outra maneira de realizar a mesma coisa, caso você não goste da sintaxe ternária ou ngIfs (etc).

Cody
fonte
1
Uma classe é algo totalmente diferente do que um atributo (o que a pergunta é sobre)
Günter Zöchbauer
1
Você também pode se esforçar para torná-la uma resposta adequada à pergunta, então eu tinha um motivo para reconsiderar meu voto e também poderia ter votado negativamente sem adicionar um comentário para mantê-lo no escuro sobre o que era o voto negativo.
Günter Zöchbauer 22/03
1
@ Você pode explicar (dê um exemplo de código) como seu método funcionará com o checkedatributo (adicione / remova-o da tag de entrada) <input type="checkbox" name="vehicle" value="Car" checked>? (se mudar classpara checkboxem seu código que não funciona (eu verificar isso))
Kamil Kiełczewski