I\'m trying to use ng-options with a to bind a numeric integer value to a list of corresponding options. In my controller, I have something like
Angular's documentation for the ng-select
directive explains how to solve this problem. See https://code.angularjs.org/1.4.7/docs/api/ng/directive/select (last section).
You can create a convert-to-number
directive and apply it to your select tag:
JS:
module.directive('convertToNumber', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$parsers.push(function(val) {
return val != null ? parseInt(val, 10) : null;
});
ngModel.$formatters.push(function(val) {
return val != null ? '' + val : null;
});
}
};
});
HTML:
<select ng-model="model.id" convert-to-number>
<option value="0">Zero</option>
<option value="1">One</option>
<option value="2">Two</option>
</select>
Note: I found the directive from the doc does not handle nulls so I had to tweak it a little.
While the solution provided by Mathew Berg works it will probably break other selects that use sting-valued select options. This may be a problem if you try to write one universal directive for handling selects (like I did).
A nice workaround is to check if the value is a number (even if it is a string containing a number) and only than do the conversion, like so:
angular.module('<module name>').filter('intToString', [function() {
return function(key) {
return (!isNaN(key)) ? parseInt(key) : key;
};
}]);
or as a controller method:
$scope.intToString = function(key) {
return (!isNaN(key)) ? parseInt(key) : key;
};
Make id property in unitsOptions as number
self.unitsOptions = Object.keys(unitOptionsFromServer).map(function (key) {
return { id: +key, text: unitOptionsFromServer[key] };
});
http://jsfiddle.net/htwc10nx/
I think the other solutions are overly complex for simply establishing the value as an integer. I would use:
<select ng-model="model.id">
<option ng-value="{{ 0 }}">Zero</option>
<option ng-value="{{ 1 }}">One</option>
<option ng-value="{{ 2 }}">Two</option>
</select>
<select ng-model="ctrl.selectedUnitOrdinal" ng-options="+(unit.id) as unit.text for unit in ctrl.unitsOptions"></select>
You can use ng-value attribute. Like this:
<select ng-model="model.id">
<option ng-value="0">Zero</option>
<option ng-value="1">One</option>
<option ng-value="2">Two</option>
</select>