在将具有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。
答案 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,因为该时间emitEvent
将updateValueAndValidity
设置为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