Angular form.statusChanges无法与动态表单+ asyncValidation一起使用

时间:2019-11-05 16:01:16

标签: angular

在将具有asyncValidation的新FormControl动态添加到反应形式时,表单从PENDING变为VALID / INVALID,但不会触发statusChanges。

我有一个可以动态修改的表单,此后,我订阅了statusChanges。我正在打印表单的状态,可以检查状态是否已更改,但不会触发stausChanges。

这里是一个示例https://stackblitz.com/edit/angular-pvebmb?file=src%2Fapp%2Fapp.component.ts

在此示例中,您可以检查status.Changes的console.log订阅。单击该按钮后,将添加带有异步验证的新FormControl,该验证需要1秒才能完成。您可以检查一下,当您单击按钮时,表单的状态(以html格式打印)从PENDING变为INVALID,但是没有打印与statusChanges相关的console.log。

我希望每次表单状态值更改时都会触发statusChanges。

3 个答案:

答案 0 :(得分:0)

看起来是设计使然。它不会触发状态更改,因为它在初始化时(或在apply plugin: 'com.google.firebase.appdistribution' 的第一次运行时无效),并且如果您检查FormControl的代码,则将防止发出该事件。您可以在这里检查: https://github.com/angular/angular/blob/8.2.13/packages/forms/src/model.ts#L1275

如您所见,updateValueAndValidity是错误的。

这并不能真正解决您的问题,但至少可以解释为什么会这样。在您的示例中,如果在按下控件后立即将值设置为空值,则将获得该statusChange,因为该时间emitEventupdateValueAndValidity设置为true。因此,如果您确实希望statusChanges在初始化时触发,则formControl的workAround将setValue设置为空。

答案 1 :(得分:0)

当用户不输入任何内容并单击提交按钮时,当消息组件依赖于侦听输入的statusChanges时,我的验证程序不会触发错误消息时,我也会遇到类似的问题。 (注意:也许我的验证不是异步验证)

我的解决方案是在单击“提交”按钮时调用以下函数,并且可以正常工作:

validateAllFields(formGroup: FormGroup) {
    Object.keys(formGroup.controls).forEach(field => {
        const control = formGroup.get(field);
        if (control instanceof FormControl) {
            control.markAsTouched({ onlySelf: true });
            control.updateValueAndValidity();
        }
    });
}

答案 2 :(得分:0)

另一种解决方法是使用[HttpGet] // http://localhost/Assort/Create/1 public ActionResult Create(int Id) { ModelState.Remove(nameof(Id)); // this will remove binding var assort = new Assort() { Id = 'whatever', .... }; return View(assort); } [HttpPost] // http://localhost/Assort/Create/ public ActionResult Create(Models.Assort assort) { if (ModelState.IsValid) { assort.APPROVALSTATUS = "NOT APPROVED"; assort.CREATE_TIMESTAMP = DateTime.Now; assort.LAST_EDIT_TIMESTAMP = DateTime.Now; db.Assorts.Add(assort); db.SaveChanges(); return RedirectToAction("Index"); } Initialize(assort.RFNO,"CREATE"); return View(assort); } 之类的rxjs运算符从可观察对象触发初始值并将其存储在另一个可观察对象中,并使用该值代替startWith

formGroup.statusChanges