Skip to content
This repository has been archived by the owner on Apr 13, 2022. It is now read-only.

fix(input): update $viewValue when cleared #14772

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

wesleycho
Copy link
Contributor

  • Fix when user clicks clear button in an input element in IE, $viewValue not being correctly updated

This should fix #11193.

@Narretz
Copy link
Contributor

Narretz commented Jun 14, 2016

Cool! I believe writing a test is difficult because we can't click the clear button?

@wesleycho wesleycho force-pushed the fix/ie-input branch 2 times, most recently from 2445f95 to 1da5563 Compare June 14, 2016 15:51
@wesleycho
Copy link
Contributor Author

Yeah - fussing around with this a bit to get the right condition currently, but I think the right fix might be attainable here.

@wesleycho
Copy link
Contributor Author

This is a little tough - so falsy model changes will convert to the empty string, so this potentially breaks some behavior. Any ideas on good workarounds for that situation?

@wesleycho wesleycho force-pushed the fix/ie-input branch 10 times, most recently from 6273af0 to d997158 Compare June 14, 2016 17:14
var timeout;
var timeout, oldVal;
var viewValueUpdated = true, msieInput = msie >= 10 && msie <= 11;
if (msieInput && inputType === 'text') {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why only text inputs? Won't types such as number have the same issue?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like you're correct - I assumed it would have the spinner, but apparently not.

@@ -1152,10 +1158,18 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
}
};

function ieListener(ev) {
var val = element.val();
if (val === oldVal && !viewValueUpdated) return;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible that the validity changed but the value did not (similar to the value === '' && ctrl.$$hasNativeValidators check in listener)? Although I'm not seeing how that would have been handled previously either (in the !hasEvent('input') case)...

var timeout;
var timeout, oldVal;
var viewValueUpdated = false, msieInput = msie >= 10 && msie <= 11;
if (msieInput && attr.type in IE_INPUTS_WITH_CLEARING) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we even care about the type for setting the initial oldVal though? I'd think we'd always want to setup the oldVal if msieInput is true...

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wouldn't that trigger a potentially unnecessary DOM access though? That is likely more expensive than this check I think. I originally had it just accessing the value, I'd be fine changing it back.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If we keep it I think it should be part of the msieInput condition, not this setup condition.

But I'd think element.val() is cheap enough it doesn't matter.

@wesleycho
Copy link
Contributor Author

There are some complicated scenarios I'm having trouble figuring out a good solution to.

Here is an incomplete table:

Initial view value Initial model value View value after view change Model value after model change Erroneous IE input events Run $parsers/$validators
'' undefined '' N/A false true
'' null '' N/A false true
'' null N/A '' false true
'' undefined N/A N/A true false

- Fix when user clicks clear button in an input element in IE, $viewValue not being correctly updated
@gkalpak
Copy link
Member

gkalpak commented Jun 15, 2016

Wouldn't it be easier to just add an extra listener on IEs:

element.on('??mousedown/mouseup/click??', function(event) {
  deferListener(event, this, this.value);
});

@Narretz
Copy link
Contributor

Narretz commented Oct 7, 2016

@wesleycho Do you still want to work on this?

@wesleycho
Copy link
Contributor Author

Don't have the bandwidth anymore :( .

@blemaire
Copy link

blemaire commented Jun 8, 2018

What's the status on this issue (not doubt i'm not the only one encountering this)
Thanks

@gkalpak
Copy link
Member

gkalpak commented Jun 8, 2018

It has been abandoned (afaict) 😁
If anyone wants to take it over, we will be more than happy to offer guidance and reviews, but I don't think we have the resources to take it over, given that we have less than a month of active feature development before entering LTS.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

AngularJS binding does not update when IE's clear button is clicked
6 participants