我有一个大的反应形式,它基于从应该触发验证的多选输入所做的选择进行条件验证。我注意到,当选择或取消选择某个项目时,整个表单被标记为无效(使用ng-invalid类),但内部子输入在它们应该有效时表示无效,或者反之亦然UNTIL你要么关注输入或者如果您只是在页面上的任何位置单击选择之外。
https://stackblitz.com/edit/angular-6mbw5r
Repro步骤:
class="ng-untouched ng-pristine ng-invalid"
转到class="ng-untouched ng-invalid ng-dirty"
UNTIL您单击ng-select
(或任何其他字段)组件。然后转到class="ng-dirty ng-touched ng-valid"
。备用Repro步骤:
我已经进行了OnPush更改检测,并且确保我可以随时随地进行任何条件更改markForCheck()
。我还将整个表单组更新策略设置为'change'
,根据我的理解,应该在表单字段更改值后立即触发验证。
我已经阅读了很多关于如何使用角度(https://www.dev6.com/Angular2-Conditional-Validation-with-Reactive-Forms,https://dzone.com/articles/how-to-do-conditional-validation-on-valuechanges-m)中的反应形式进行条件表单验证的文章。
我还以为我已经弄明白了这两个问题:https://github.com/angular/angular/issues/13200 https://github.com/angular/angular/issues/14542(stackblitz链接中的第161行),但这也没有帮助。
似乎与点击事件后发生的变更检测有关(我知道检测应该发生在事件,异步事件等)或valueChanges
订阅不能在兄弟组件之间准确更新直到焦点已经改变。我推测updateValueAndValidity()
会触发变化检测,但似乎没有。
任何帮助都会很棒!