I have a set of selects that all have the same options. Then I run those options through a filter so that any options that are selected in a different select don't show up in the select. See this jsFiddle (in non-IE browser) to see what I mean. Basically I'm preventing the same option from being selected multiple times among the selects
Now, what I've done has an issue in IE. Open that fiddle in IE (I've only tried it in IE9, but I'm guessing previous versions have the same issue). Change the last select to AAA. Notice how the 3 other selects all changed what they display. The model for them did not change, but IE somehow chokes when the options are changed.
My questions is first, am I doing something wrong with this functionality in general? This same code does exactly what I want in Chrome and FF, but am I doing something that I just shouldn't be? Second, how can I get around this in IE? I tried some timeouts that would clear and re-set the model, but things noticeable jumped around. I'm wondering if there's a good, clean, low impact workaround for this.
Any help would be much appreciated. Thanks.
--UPDATE--
This has been fixed in Angular itself with version 1.3.3 using A. S. Ranjan's solution below. See new fiddle with 1.3.3: http://jsfiddle.net/m2ytyapv/
//dummy code so I can post the edit
Adding couple of lines the following places (marked in bold as **) in render function of the selectDirective in angular.js worked fine for me. I am looking if there is any other possible solution other than patching angularJS or the forEach given below?
and
The issue was the label attribute of HTMLOptionElement is not the same as the text attribute if label is blank in IE.
This can be seen verified by adding the following code after the screen has loaded and looking at the web console of FF and IE to see the difference. If you uncomment the last line where the label is set to text it works fine. Alternatively patch angular.js as above.
On the lines of Mathew Berg answer, I modified it to work using AngularJS directive:
This way the fix applies to all
select
elements in the project and you do not have to change any existing HTML markup. I also used the following method to detect IE version to setisIE9
variable totrue
:There is less expensive way to enforce control re-rendering after dynamic options are added. So, instead of inserting/removing dummy element to the dropdown you can reset CSS styles which cause control rendering, e.g.
The rendering gets updated and synched if you change some attribute. An innocuous change may be to set the
selectedIndex
attribute to its own value:I experienced the same issue the other night and after throwing everything I could think of at it I've come to the conclusion that IE just doesn't want to handle updating filters when using selects.
My solution is to change your selects to look like this:
They now have a class and an ng-change on them. Then in your controller do this fun little bit of code:
What it does is rip the elements out of the DOM and replace them into the same location. Here's a working fiddle jsFiddle
Some of the other solutions I tried that didn't involve javascript were things like toggling the display/visibility of the select. Having their zIndex's moved. The only thing that for sure fixed it was this piece of code.
Seems that ie9 have problem with the index. Taking the second example and change it to the following code it worked:
http://jsfiddle.net/seoservice/nFp62/10/