Tenho dados como estes:
const List: Array<Item> = [
{ id: 1, name: 'somename' }
...
]
Então o HTML fica assim:
<ng-container *ngFor="let item of list; let i = index;">
<div class="grid">
<mat-checkbox *ngIf="item.id > 4;" #{{item.name}}
value="false"
type="checkbox">
</mat-checkbox>
<mat-form-field *ngIf="item.id <= 4">
<input formControlName="{{item.name}}" matInput value="" type="number"/>
</mat-form-field>
<mat-form-field *ngIf="item.id > 4 && item.name.checked">
<input formControlName="{{item.name}}" matInput value="" type="number"/>
</mat-form-field>
</div>
</ng-container>
NgFor itera pela matriz e cria mat-checkbox's e mat-form-field's.
Há um campo de formulário para cada item na matriz, mas apenas alguns itens de campo de formulário recebem caixa de seleção.
Os campos de formulário que não recebem caixa de seleção ficam visíveis o tempo todo.
Os campos de formulário que recebem caixa de seleção SOMENTE ficam visíveis depois que a caixa de seleção correspondente é marcada.
Meu problema é como faço para que o campo do formulário seja exibido depois que sua caixa de seleção for marcada checked
?
A #{{item.name.checked}}
ligação não está funcionando
Editar:
const List: Array<Item> = [
{ id: 1, name: 'somename', class: 'hide' }
...
]
<mat-checkbox #checkBoxId class="{{item.class}}"
type="checkbox">
</mat-checkbox>
SCSS
.hide {
display: none;
}
Quando você usa uma variável de referência de modelo dentro de um
*ngFor
(ou dentro de um@for
) o "escopo" é relativo a este loopO que significa isso? que você usa o "mesmo" nome de variável (no código
checkBoxId
)OBSERVAÇÃO: Ao usar ReactiveFormsControls, não use "value", apenas dê valor ao formControl.
Atualização Como indicado nos comentários (obrigado pelo conselho @Dozobus), há um problema quando o mat-check está sob um *ngIf. Podemos substituir o *ngIf por
[style.display]="i<=4?'non':null"
ou usar
NOTA: Ao enviar precisamos levar em conta esta caixa de seleção mat, podemos usar algumas como
NOTA2: No stackblitz coloquei diferentes maneiras de gerenciar o problema usando o novo
@for
e@if
Você precisará armazenar os estados das caixas de seleção em uma matriz ou objeto e atualizar a visibilidade dos campos do formulário adequadamente.
No modelo, você usará o evento [(ngModel)] ou (change) do Angular para rastrear o estado das caixas de seleção e vincular a visibilidade do campo de formulário com base nesse estado.
Uma refatoração da minha resposta
bem, minha resposta anterior precisa em submit verificar os valores do checkbox. Podemos tirar vantagem que, quando um formControl está desabilitado o form.value omite esse formControl.
Então, primeiro faça uma diretiva desabilitada
Isso é necessário porque precisamos usar os métodos
disable
eenable
para desabilitar/habilitar um formControl.Gosto mais que o array "itens" tenha uma propriedade "opcional", então pode ser, por exemplo
E criamos o formGroup como
Bem, podemos ter um .html como (veja que desabilitamos o controle em vez de colocar sob um *ngIf
A última peça do quebra-cabeça é adicionada em component.css
um stackblitz