I have a bunch of select lists and I'm trying to add a "none" and a title option to them. The code looks like so:
<select ng-options="value.name for value in values" ng-model="selection">
<option value="" disabled>{{title}}</option>
<option value="">None</option>
</select>
For right now, I cannot add them to the data so I am trying to find a way to get this working. When I load them for the first time, the "none" option is not there. The title is there and works as intended, but it seems I cannot add two blank entries to this select list.
The easiest way would be to have the "none" option added to the data but it's not a possibility for me. Is there a proper way to achieve what I want?
The ngOptions attribute can be used to dynamically generate a list of <option> elements for the <select> element using the array or object obtained by evaluating the ngOptions comprehension expression.
ng-options is the directive which is designed specifically to populate the items of a dropdown list. One major advantage using ng-options for the dropdown is, it allows us to pass the selected value to be an object. Whereas, using ng-repeat the selected value can only be string.
Use ng-init to set default value for ng-options .
The ng-options directive fills a <select> element with <options>. The ng-options directive uses an array to fill the dropdown list. In many cases it would be easier to use the ng-repeat directive, but you have more flexibility when using the ng-options directive.
That's correct, you can only have one hard-coded element. <option ng-repeat>
can technically be done, but that method only cleanly supports binding to strings, so it would get very kludgey to bind to objects, as you're doing.
You say you can't add "None" to the data, but you can do the next best thing: prepend it to the array ng-options is iterating across, using a filter:
app.filter('addNone', function () {
return function(input) {
var newArray = input.slice(0); //clone the array, or you'll end up with a new "None" option added to your "values" array on every digest cycle.
newArray.unshift({ name: "None" });
return newArray;
};
})
Then use the filter like this:
<select class="form-control" ng-options="value.name as value.name for value in filter.values | addNone" ng-model="filter.selected" ng-change="goSearch()">
<option value="" disabled>{{filter.name}}</option>
</select>
It's impossible with ngOptions
, as explicitly mentioned in the documentation (emphasis mine):
Optionally, a single hard-coded
<option>
element, with the value set to an empty string, can be nested into the<select>
element. This element will then represent thenull
or "not selected" option.
If you want, you can manually construct the options list with the ngRepeat
directive:
<select ng-model="selection">
<option value="" disabled>{{title}}</option>
<option ng-repeat="value in values">{{value.name}}</option>
<option value="">None</option>
</select>
But I would strongly advice against that, as it's absolutely not semantic: your title isn't an option. Do you have contemplate to use a heading element, a <label>
or an <optgroup>
(with the group by
expression in ngOptions
) instead?
<select ng-options="value.name group by title for value in values" ng-model="selection">
<option value="">None</option>
</select>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With