【问题标题】:How to disable a form control based on the value of another form control right at initialization on reactive angular forms?如何在初始化反应角度表单时根据另一个表单控件的值禁用表单控件?
【发布时间】:2020-08-06 16:29:21
【问题描述】:

我有 2 个表单控件,一个是选择另一个是输入字段:

      <form  [formGroup]="timeForm">
          <div>
            <mat-form-field appearance="outline" class="fullInputWidth">
              <mat-label>Sunday</mat-label>

              <mat-select formControlName="SundayStatus">
                <mat-option value="Opened">Opened</mat-option>
                <mat-option value="Closed">Closed</mat-option>
              </mat-select>
            </mat-form-field>
          </div>

          <div>
            <mat-form-field appearance="outline" class="fullInputWidth">
              <mat-label>Opens at</mat-label>
              <input formControlName="SundayOpen" name="SundayOpen" matInput autocomplete="off" [format]="24" [ngxTimepicker]="SundayOpen" readonly > 
              <ngx-material-timepicker #SundayOpen [minutesGap]="15"></ngx-material-timepicker>
            </mat-form-field>
          </div>
       </form>

在我的组件内部:

  this.timeForm = this.formBuilder.group({
      SundayStatus: ['Closed'],
      SundayOpen: [''] 
}):

所以我想在控件“SundayStatus”的值为“Closed”时禁用表单控件:“SundayOpen”。

现在的问题是“SundayStatus”的值已经初始化为“Closed”。

如果我将此代码放在输入#SundayOpen:

[disabled]="timeForm.get('SundayStatus').value == 'Closed'"

它不会第一次禁用控件,但一旦我将下拉值更改为“打开”==>“关闭”,它就会起作用

救命!

【问题讨论】:

  • 试试timeform.controls['SundayStatus'].value === 'Closed' 如果这不起作用,请尝试提供一个重现问题的stackblitz
  • 当您使用响应式表单时,请勿在模板中使用[disabled]。避免混合响应式表单和模板表单

标签: angular typescript angular-material


【解决方案1】:

你必须听 valueChanges:

const sundayStatusControl = this.timeForm.get('SundayStatus');
sundayStatusControl.valueChanges.pipe(
  takeUntil(this._ngOnDestroy$)
).subscribe(newStatus => {
  if (newStatus === 'Closed') {
    this.timeForm.get('SundayOpen').disable();
  } else {
    this.timeForm.get('SundayOpen').enable();
  }
});
sundayStatusControl.updateValueAndValidity();

如果你有 7 个表单控件,你可以将它们组合成一个循环:

const days = [
  'Monday',
  'Tuesday',
  'Wednesday',
  'Thirsday',
  'Friday',
  'Saturday',
  'Sunday'
]
for (const day of days) {
  const control = this.timeForm.get(`${day}Status`);
  control.valueChanges.pipe(
    takeUntil(this._ngResetForm$)
  ).subscribe(newStatus => {
    if (newStatus === 'Closed') {
      this.timeForm.get(`${day}Open`).disable();
    } else {
      this.timeForm.get(`${day}Open`).enable();
    }
  });
  control.updateValueAndValidity();
}

【讨论】:

  • 所以我在这里有 7 天的控制(周日到周六),所以需要对每一个都做同样的事情吗? :( :(
  • 顺便说一句,此解决方案也不起作用,因为 valueChanges 仅在下拉状态更改后才起作用...我需要在第一次将其禁用。因为该值被初始化为'已经关门了。
  • @BiswasKhayargoli 您可以手动触发:updateValueAndValidity()
  • @BiswasKhayargoli 更新了本周的解决方案
猜你喜欢
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-07-06
  • 2019-10-30
  • 1970-01-01
  • 2019-02-04
  • 2011-06-16
相关资源
最近更新 更多