我有如下数据:
const List: Array<Item> = [
{ id: 1, name: 'somename' }
...
]
然后 html 看起来像这样:
<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 遍历数组并创建 mat-checkbox 和 mat-form-field。
数组中每个项目都有表单字段,但只有一些表单字段项目获得复选框。
没有复选框的表单字段始终可见。
仅当选中相应的复选框后,才可见带有复选框的表单字段。
我的问题是,如何在选中复选框后显示表单字段checked
?
绑定#{{item.name.checked}}
无效
编辑:
const List: Array<Item> = [
{ id: 1, name: 'somename', class: 'hide' }
...
]
<mat-checkbox #checkBoxId class="{{item.class}}"
type="checkbox">
</mat-checkbox>
SCSS
.hide {
display: none;
}
*ngFor
当您在 内部(或 内部)使用模板引用变量时,@for
“范围”与此循环相关。这是什么意思?你使用“相同”的变量名(在代码中
checkBoxId
)注意:当您使用 ReactiveFormsControls 时不要使用“value”,只需为 formControl 赋予值。
更新正如评论中所指出的(感谢 @Dozobus 的建议),当 mat-check 位于 *ngIf 下时会出现问题。我们可以用以下方法替换 *ngIf
[style.display]="i<=4?'non':null"
或使用
注意:在提交时我们需要考虑这个 mat-checkbox,我们可以使用一些类似的
注2:在stackblitz中,我提出了不同的方法来处理这个问题,使用新的
@for
和@if
您需要将复选框状态存储在数组或对象中,并相应地更新表单字段的可见性。
在模板中,您将使用 Angular 的 [(ngModel)] 或 (change) 事件来跟踪复选框的状态并根据该状态绑定表单字段可见性。
重构我的答案
好吧,我之前的回答需要在提交时检查复选框的值。我们可以利用这一点,当 formControl 被禁用时,form.value 会忽略此 formControl。
因此,首先禁用一个指令
这是必要的,因为我们需要使用这些方法
disable
来enable
禁用/启用 formControl。我更喜欢“items”数组有一个“optional”属性,因此可以是,例如
我们创建 formGroup 为
好吧,我们可以有一个像这样的 .html(看到我们禁用了控件,而是放在 *ngIf 下
拼图的最后一块是添加 component.css
一场堆栈闪电战