194

I'm a little bit confused with Angular and ng-options.

I have a simple array and I want to init a select with it. But, I want that options value = label.

script.js

$scope.options = ['var1', 'var2', 'var3'];

html

<select ng-model="myselect" ng-options="o for o in options"></select>

What I get:

<option value="0">var1</option>
<option value="1">var2</option>
<option value="2">var3</option>

What I want:

<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>

So I tried:

<select ng-model="myselect2" ng-init=0 ng-options="options[k] as v for (k,v) in options"></select>

<select ng-model="myselect3" ng-init=0 ng-options="b as b for b in options"></select>

(But it didn’t work.)

Edit:

My form is submitted externally, which is why I need 'var1' as the value instead of 0.

5 Answers 5

314

You actually had it correct in your third attempt.

 <select ng-model="myselect" ng-options="o as o for o in options"></select>

See a working example here: http://plnkr.co/edit/xEERH2zDQ5mPXt9qCl6k?p=preview

The trick is that AngularJS writes the keys as numbers from 0 to n anyway, and translates back when updating the model.

As a result, the HTML will look incorrect but the model will still be set properly when choosing a value. (i.e. AngularJS will translate '0' back to 'var1')

The solution by Epokk also works, however if you're loading data asynchronously you might find it doesn't always update correctly. Using ngOptions will correctly refresh when the scope changes.

Sign up to request clarification or add additional context in comments.

13 Comments

You're off topic. You didn't understand the instructions. He want value in his select.
I understood the instructions, however it's quite likely his intent is to bind the 'value' to the model, and is misunderstanding what's happening due to the way AngularJs is rendering the tag.
It works if you get select's value with angular, but in my case (ie classic submit form), values will be 0,1,2,3, not var1,var2,var3
I assumed you were binding to the model, but if you're simply using AngularJS to render a form submitted externally to angular, then use EpokK's solution.
Is it just me, or is this the most jacked-up and unclear syntax ever?
|
35

You can use ng-repeat with option like this:

<form>
    <select ng-model="yourSelect" 
        ng-options="option as option for option in ['var1', 'var2', 'var3']"
        ng-init="yourSelect='var1'"></select>
    <input type="hidden" name="yourSelect" value="{{yourSelect}}" />
</form>

When you submit your form you can get value of input hidden.


DEMO

ng-selected ng-repeat

1 Comment

If you have dicreased my answer, check my new solution.
24

If you setup your select like the following:

<select ng-model="myselect" ng-options="b for b in options track by b"></select>

you will get:

<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>

working fiddle: http://jsfiddle.net/x8kCZ/15/

3 Comments

This solution was the only one that worked for me for selecting the initial value in an array of strings.
yeah this should be the answer, the track by does the magic for me.
i was least expecting after following above solutions but this was the easy way out
22

you could use something like

<select ng-model="myselect">
    <option ng-repeat="o in options" ng-selected="{{o==myselect}}" value="{{o}}">
        {{o}}
    </option>
</select>

using ng-selected you preselect the option in case myselect was prefilled.

I prefer this method over ng-options anyway, as ng-options only works with arrays. ng-repeat also works with json-like objects.

3 Comments

ng-options works with object data sources, too. See docs.angularjs.org/api/ng/directive/select
Although others gave workarounds, this soltion is by far the most elegant and close to old html style, works with both angular model binding and form submital. Thanks!
ng-selected does not need the handlebars since it is an angular directive. Excellent solution.
10
<select ng-model="option" ng-options="o for o in options">

$scope.option will be equal to 'var1' after change, even you see value="0" in generated html

plunker

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.