使用反应式表单在 Angular 中检查后,表达式发生了变化

Posted

技术标签:

【中文标题】使用反应式表单在 Angular 中检查后,表达式发生了变化【英文标题】:Expression has changed after it was checked in Angular using Reactive Forms 【发布时间】:2019-08-04 21:41:12 【问题描述】:

我正在使用 Angular 6 做一个 Web 应用程序,并且我正在使用 Reactive Forms。我有一个带有数组的表单组,我在ngOnInit 中设置值。我有一个自定义验证器来了解名为 id 的字段是否是唯一的。

officesFormGroup: FormGroup;

constructor(private fb: FormBuilder) 
    this.officesFormGroup = this.fb.group(
      offices: this.fb.array([], Validators.required)
    );
  

ngOnInit() 
      this.setOffices();
  

setOffices() 
    const control = this.officesForm;

    this.company.offices.forEach((office, index) => 
      control.push(this.fb.group(
        id: office.id,
        name: office.name,
        address: office.address,
        services: this.fb.array([], Validators.required)
      , validator: this.officeValidator.bind(this)));
  

officeValidator(control: AbstractControl) 
    const id = control.get('id').value;

    if (id !== null && id !== '') 
      const offices: Office[] = this.officesForm.value;

      const isIdUnique = offices.map(office => office.id)
        .some(value => value === id);

      if (isIdUnique) 
        control.get('id').setErrors(unavailable: true);
       else 
        control.get('id').setErrors(null);
      
    
  

get officesForm() 
    return this.officesFormGroup.get('offices') as FormArray;
  

将新办公室添加到阵列中:

addOffice() 
    const office = this.fb.group(
      id: [null, Validators.required],
      name: [null, Validators.required],
      address: [null, Validators.required],
      services: this.fb.array([], Validators.required)
    , validator: this.officeValidator.bind(this));

    this.officesForm.push(office);
  

ExpressionChangedAfterItHasBeenCheckedError:表达式已更改 检查后。以前的值:'ngIf: false'。当前值: 'ngIf: true'。

第一次加载页面时,id 字段显示为红色,好像有错误一样,这是错误的。如果用户添加另一个办公室并在id 字段中写入内容,它应该检查唯一性。

我的目标是,如果用户添加新办公室或尝试编辑现有办公室的id,请检查id 是否唯一,我的意思是,如果没有其他办公室具有相同的id

【问题讨论】:

【参考方案1】:

我在我的应用程序中使用了 @rxweb/reactive-form-validators 的唯一验证器,通过在我的 formControl 实例中使用 RxwebValidators.unique() 来检查 Id 是否唯一,因为在某个级别上我遇到了同样的问题。

我已在 Id 属性上应用了唯一验证器。请看下面的代码

组件.ts:

export class UniqueValidatorComponent implements OnInit 


officesFormGroup: FormGroup;

constructor(private fb: FormBuilder) 
    this.officesFormGroup = this.fb.group(
      offices: this.fb.array([])
    );
  

ngOnInit() 

  this.addOffice();

  
addOffice() 
    const office = this.fb.group(
      id: [null,[ Validators.required,RxwebValidators.unique()]],
      name: [null, Validators.required],
      address: [null, Validators.required],
      services: this.fb.array([], Validators.required,)
    );
     this.officesForm.push(office);
  
get officesForm() 
    return this.officesFormGroup.get('offices') as FormArray;
  



请参考这个例子:Stackblitz

参考这个Question 与唯一验证相关

【讨论】:

RxwebValidators 将检查您添加的id 是否已存在于阵列中的另一个办公室,对吗?如何?我不明白RxwebValidators 在哪里或如何比较所有id @RRGT19 一旦你在相应的列上放置了唯一验证器,唯一验证器将验证该列的其他行的值。你可以参考这篇文章:medium.com/@oojhaajay/…

以上是关于使用反应式表单在 Angular 中检查后,表达式发生了变化的主要内容,如果未能解决你的问题,请参考以下文章

从用户 HTML 检查和手动属性删除中禁用 Angular 反应式表单字段是不是安全?

Angular 2 / PrimeNG - 表达式在检查后发生了变化。在最后一个无效的表单控件上绑定 NgModel

根据最初检查的复选框值在后退按钮单击时重新加载 Angular 6 反应式表单

Angular 5 - 反应形式

使用自定义验证和动态值的 Angular 表单

加载数据后设置反应形式(异步) - Angular 5