Here's some quick background info. I just upgraded to Angular 1.4. I'm using an API written in C# for my server-side calls.
A section of my page shows 2 select lists (Project & Sub-project). Both are supposed to default to "(Select a ______)", which I list as the first option of each select with "value" of 0. The appropriate ng-model variables are initialized to 0.
The actual HTML code for the select lists is being generated on the server side using string concatenation, passed to the client via $http, and inserted using a directive that calls $compile (not ideal at all, but my client has pretty much chained me to this API). Prior to the 1.4 update, everything was working nicely.
Now, my Project select list is defaulting to nothing. When I inspect the element, this is what I see...
<select ng-change="updateSubProjList()" ng-model="curProjID">
<option value="? number:0 ?"></option>
<option value="0">(Select a Project)</option>
<option value="1">First Project</option>
<option value="2">Second Project</option>
There seems to be a change in 1.4 related to how the selected option is matched against
ngModel by comparing the
value attribute in
<option value="0"> - it now requires to explicitly use a string to match, rather than allowing for an integer.
In fact, the documentation clearly states:
The value of a
selectdirective used without
ngOptionsis always a string. When the model needs to be bound to a non-string value, you must either explicitly convert it using a directive ... or use
ngOptionsto specify the set of options.
To fix, change the initialized value of
$scope.curProjID to be a string:
$scope.curProjID = "0"; // instead of $scope.curProjID = 0;
When there is no match (and there isn't, unless you assign a string
select adds an "unknown" option:
<option value="? number:0 ?"></option>.