feat(ngChange): ensure ng-change listeners are run after validation #14043
Description
Hi there,
right now, ng-change
listeners do not always run after validation. It's only the case if ngModelOptions.allowInvalid
is falsy.
Please let me show you (based on the latest master when writing this post, 9421674) the code-flow to better understand, why and what we can do to change that:
- Let's have a look at the
ng-change
directive, it utilizes the$viewChangeListeners
:
- Right now, the
$viewChangeListeners
are only run inside$$writeModelToScope
:
$$writeModelToScope
is invoked inside$validate
which is not a problem, but also inside$$parseAndValidate
. In the following Screenshot you'll see the problem. As soon asallowInvalid
is truthy, then$$writeModelToScope
is invoked before the validators are run. This is problematic, as it should be possible to rely (insideng-change
) on the fact, that the validation state of ngModelCtrl is already up-to-date:
Now, my proposal is, to move the yellow colored code block to come after the validation block.
I think that this change should be relatively trivial if I'm correct that the $$runValidators(...)
invocation (line 736) is not dependent on ctrl.$modelValue
. As I can't imagine any application relying actually on the contrary (that $viewChangeListeners
fire before validation, in case allowInvalid
is set to true
), I think this would not be a breaking change either.
What do you think?
Regards,
Nicolas