How do I set the value property in AngularJS' ng-options? How do I set the value property in AngularJS' ng-options? angularjs angularjs

How do I set the value property in AngularJS' ng-options?


See ngOptions

ngOptions(optional) – {comprehension_expression=} – in one of the following forms:

For array data sources: label for value in arrayselect as label for value in arraylabel group by group for value in arrayselect as label group by group for value in array track by trackexprFor object data sources:label for (key , value) in objectselect as label for (key , value) in objectlabel group by group for (key, value) in objectselect as label group by group for (key, value) in object

In your case, it should be

array = [{ "value": 1, "text": "1st" }, { "value": 2, "text": "2nd" }];<select ng-options="obj.value as obj.text for obj in array"></select>

Update

With the updates on AngularJS, it is now possible to set the actual value for the value attribute of select element with track by expression.

<select ng-options="obj.text for obj in array track by obj.value"></select>

How to remember this ugly stuff

To all the people who are having hard time to remember this syntax form: I agree this isn't the most easiest or beautiful syntax. This syntax is kind of an extended version of Python's list comprehensions and knowing that helps me to remember the syntax very easily. It's something like this:

Python code:

my_list = [x**2 for x in [1, 2, 3, 4, 5]]> [1, 4, 9, 16, 25]# Let people to be a list of person instancesmy_list2 = [person.name for person in people]> my_list2 = ['Alice', 'Bob']

This is actually the same syntax as the first one listed above. However, in <select> we usually need to differentiate between the actual value in code and the text shown (the label) in a <select> element.

Like, we need person.id in the code, but we don't want to show the id to the user; we want to show its name. Likewise, we're not interested in the person.name in the code. There comes the as keyword to label stuff. So it becomes like this:

person.id as person.name for person in people

Or, instead of person.id we could need the person instance/reference itself. See below:

person as person.name for person in people

For JavaScript objects, the same method applies as well. Just remember that the items in the object is deconstructed with (key, value) pairs.


How the value attributes gets its value:

  • When using an array as datasource, it will be the index of the array element in each iteration;
  • When using an object as datasource, it will be the property name in each iteration.

So in your case it should be:

obj = { '1': '1st', '2': '2nd' };<select ng-options="k as v for (k,v) in obj"></select>


I had this issue too. I wasn't able to set my value in ng-options. Every option that was generated was set with 0, 1, ..., n.

To make it right, I did something like this in my ng-options:

HTML:

<select ng-options="room.name for room in Rooms track by room.price">    <option value="">--Rooms--</option></select>

I use "track by" to set all my values with room.price.

(This example sucks: because if there were more than one price equal, the code would fail. So BE SURE to have different values.)

JSON:

$scope.Rooms = [            { name: 'SALA01', price: 100 },            { name: 'SALA02', price: 200 },            { name: 'SALA03', price: 300 }        ];

I learned it from blog post How to set the initial selected value of a select element using Angular.JS ng-options & track by.

Watch the video. It's a nice class :)