ng-options with simple array init
Asked Answered
D

5

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.

Devilfish answered 13/8, 2013 at 6:28 Comment(0)
D
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.

Darfur answered 13/8, 2013 at 6:34 Comment(13)
You're off topic. You didn't understand the instructions. He want value in his select.Verdieverdigris
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.Darfur
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,var3Devilfish
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.Darfur
Question was pretty clear, but I figured there was a good chance you were simply wanting to bind to the model, and looking at the rendered HTML assuming you were getting the ngOptions statement wrong, when you were in fact correct.Darfur
o for o in options is enoughUnadvised
Is it just me, or is this the most jacked-up and unclear syntax ever?District
Not just you. It makes sense once you understand it, but it could be a lot nicer.Darfur
It does not work for me. I am getting 0, 1, 2, .. etc in the options text.Seepage
@JamesDavies thanks. your answer doesnt solve Dragus question, but solves mine. :)Monomial
is there any way to get the actual value instead of the index.Brutify
I don't like this solution because it does not preselect the options if you init $scope.myselect = 0;. You can init with $scope.myselect = 'var1'; but e.g. if you reload from a database you have to map the value first.Congius
So I would go for an array of json objects: plnkr.co/edit/Fie2LFbVwncN69RM1pPV?p=preview if data needs to be reloaded.Congius
V
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

Verdieverdigris answered 13/8, 2013 at 6:29 Comment(1)
If you have dicreased my answer, check my new solution.Verdieverdigris
M
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/

Maddux answered 14/7, 2015 at 19:7 Comment(3)
This solution was the only one that worked for me for selecting the initial value in an array of strings.Columbian
yeah this should be the answer, the track by does the magic for me.Castanets
i was least expecting after following above solutions but this was the easy way outBrutify
A
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.

Annulation answered 18/3, 2014 at 16:12 Comment(3)
ng-options works with object data sources, too. See docs.angularjs.org/api/ng/directive/selectIsthmian
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!Heterodyne
ng-selected does not need the handlebars since it is an angular directive. Excellent solution.Fibrous
U
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

Unadvised answered 13/8, 2014 at 9:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.