Angular2 Reactive Forms - 从条件动态禁用表单控件

时间:2017-05-15 23:51:31

标签: angular angular2-forms

我有一个我想根据条件动态禁用的选择控件:

this.activityForm = this.formBuilder.group({
  docType: [{ value: '2', disabled: this.activeCategory != 'document' }, Validators.required]
});

但是,即使在某些时候this.activeCategory变为'document',docType也不会启用。

我该如何解决这个问题?

5 个答案:

答案 0 :(得分:29)

由于我不知道你是如何操纵activeCategory(也许它也是FormControl?),我会建议采用以下方法:

您可以使用(change)来检测this.activeCategory何时发生变化,如下所示:

1 - 如果您正在使用ngModel

<input type="text" [(ngModel)]="activeCategory" (change)="checkValue($event)">

2 - 如果是FormControl

<input type="text" formControlName="activeCategory" (change)="checkValue($event)">

因此,在组件中,您可以使用docType方法操纵disable/enable 控件

checkValue(event: Event) {
  const ctrl = this.activityForm.get('docType');

  if (event.value === 'document') {
    ctrl.enable();
  } else {
    ctrl.disable();
  }
}

答案 1 :(得分:7)

您必须以不同于其他HTML元素的方式处理select元素。 this.activeCategory更改时,您必须执行重置。

这样的事情:

this.activityForm.controls['docType'].reset({ value: '2', disabled: false });

当然,您可能希望使用当前值,而不是硬编码'2'

同样的事情要禁用它,如果需要(可能会)。

this.activityForm.controls['docType'].reset({ value: '2', disabled: true });

有关ng表单控件reset的更多信息。

答案 2 :(得分:1)

从.ts文件,您可以从控件中添加密钥, 并在其中添加禁用的项:true(停用表单项) 或false(激活表单项)

.ts

public form_name=new FormGroup({

              series: new FormControl({value: '', disabled: true}),
              inten: new FormControl({value: '', disabled: true}),
              rep: new FormControl({value: '', disabled: true}),
              rest: new FormControl({value: '', disabled: false}),
              observation: new FormControl({value: '', disabled: false}),



  });

.html

<form  [formGroup]="form_name" >

                                          <label for="series"  >Series</label>
                                           <input type="text" formControlName="series" >

                                          <label for="inten"  >Inten</label>
                                           <input type="text" formControlName="inten" >

                                          <label for="rep"  >Rep</label>
                                           <input type="text" formControlName="rep" >

                                           <label for="rest"  >rest</label>
                                            <textarea formControlName="rest" rows="3" cols="30" ></textarea>


                    </form>

答案 3 :(得分:0)

this.activityForm.controls ['docType']。disable();

答案 4 :(得分:-1)

您可以在此处使用三元运算符来有条件地禁用表单控制。

this.activityForm = this.formBuilder.group({
docType: [{ value: '2', disabled: this.activeCategory != 'document' ? true : false }, Validators.required]
});