Angular: 表单验证器在视图(重新)创建时重新运行

创建于 2017-09-28  ·  1评论  ·  资料来源: angular/angular

我要提交...


[ ] Regression (a behavior that used to work and stopped working in a new release)
[x] Bug report  <!-- Please search GitHub for a similar issue or PR before submitting -->
[ ] Feature request
[ ] Documentation issue or request
[ ] Support request => Please do not submit support request here, instead see https://github.com/angular/angular/blob/master/CONTRIBUTING.md#question

当前行为

当在视图中创建与表单控件关联的指令时,将触发验证器。

预期行为

视图更改时不应模型

使用说明最小化问题的重现

https://stackblitz.com/edit/angular-reactive-forms-issue?file=app/app.component.ts

  1. 打开控制台。
  2. 使用 _Toggle visiblity_ 按钮确认验证器正在每个控制指令创建上运行。

改变行为的动机/用例是什么?

  1. 从以上步骤继续。
  2. 按_set errors手动_手动插入错误(这是在后端返回验证后手动设置错误的模拟)
  3. 按 _Toggle visiblity_ 使其消失。 控制台没有任何反应。
  4. 再次按下它使控件出现。 请注意控制台日志,这意味着验证器正在运行。

请注意错误消息现已消失的事实。 切换视图是在模拟具有多部分形式的用例。


如果这是设计使然,我看不出有什么原因。 我们正在创建一个视图,我们在其中编写要查看的数据表单模型。 据我所知,从模型中读取的操作不应触发验证器。 在我看来,当在模型中创建FormControl实例时,应该运行验证器。 _当值没有改变时,为什么会触发验证器?_

环境

<br i="34"/>
Angular version: 4.3.6<br i="35"/>
<!-- Check whether this is still an issue in the most recent Angular version -->
P4 forms validators medium confirmed triage #1 bufix

最有用的评论

是的,听起来不错。
视图中的更改不应影响响应式形式的模型,模型上的任何更改不应触发验证。

我已将其指向https://github.com/angular/angular/blob/17eaef0311990e1a06c028f19bc6c63dcd775f31/packages/forms/src/directives/reactive_directives/form_group_directive.ts#L98 -L104

它总是运行一个新的验证运行( updateValueAndValidity() ),而只有在控制指令引入了新的验证器时才应该这样做。

此外,将函数重命名为addControlDirective()可能会减少对其正在执行的操作的混淆。

可能与 #14376 有某种关系,它既是关于在反应式表单上编辑视图,又看起来FormGroupDirective有问题。

>所有评论

是的,听起来不错。
视图中的更改不应影响响应式形式的模型,模型上的任何更改不应触发验证。

我已将其指向https://github.com/angular/angular/blob/17eaef0311990e1a06c028f19bc6c63dcd775f31/packages/forms/src/directives/reactive_directives/form_group_directive.ts#L98 -L104

它总是运行一个新的验证运行( updateValueAndValidity() ),而只有在控制指令引入了新的验证器时才应该这样做。

此外,将函数重命名为addControlDirective()可能会减少对其正在执行的操作的混淆。

可能与 #14376 有某种关系,它既是关于在反应式表单上编辑视图,又看起来FormGroupDirective有问题。

此页面是否有帮助?
0 / 5 - 0 等级