如何根据 mat 单选按钮的值禁用 mat Input 字段?

Sev*_*Sev 3 angular-material angular angular-reactive-forms

我的表单中有一个“mat-radio-group”,它有 2 个“mat-radio-button”,其值为“yes”和“no”。

我想根据用户的选择使用这些值来启用或禁用另一个输入字段(简单的 matInput)。

我还想默认禁用 matInput(在用户从无线电组中检查“是”或“否”之前)。

我正在使用 Angular 反应式表单,并为这些输入设置了表单控件名称。

假设 formGroup 名称是“myForm”。

以下是我在模板中的代码:

<mat-radio-group formControlName="myRadio">
          <mat-radio-button value="yes" required>Yes</mat-radio-button>
          <mat-radio-button value="no" required checked>No</mat-radio-button>
</mat-radio-group>

<mat-form-field>
          <input matInput formControlName="myInput" />
</mat-form-field>
Run Code Online (Sandbox Code Playgroud)

Scr*_*thy 6

更新为首选反应方式

感谢@Severus 的评论,我想更新我的答案以反映在反应式表单上处理此问题的首选方式。我在下面的原始答案是“快速而肮脏”的方式,但是如果您想正确执行此操作,则应myInput在表单创建中将您初始化为禁用:

FormControl({ value: '', disabled: true })
Run Code Online (Sandbox Code Playgroud)

然后在单选按钮控件上添加一个“启用程序”,如下所示:

this.myForm.get('myRadio').valueChanges.subscribe(value => {
    const enableOrDisable = value !== null ? 'enable' : 'disable';
    this.myForm.get('myInput')[enableOrDisable]();
});
Run Code Online (Sandbox Code Playgroud)

原答案

注意:这种方法在使用模板驱动的表单时仍然有效,但不应在反应式表单方法中使用。如果在模板表单中使用,您只需将禁用值设置ngModel为单选按钮的绑定。

您应该能够将 disabled 设置为依赖字段的值。

<input matInput formControlName="myInput" [disabled]="!myForm.value?.myRadio" />
Run Code Online (Sandbox Code Playgroud)

然后myRadio将表单中的值初始化为null. 如果您将无线电值设置为trueandfalse而不是yesand no,那么您只需要检查一个null值 ( myForm.value?.myRadio !== null)。