I have had to make certain data structures available as angular services to our developers, making the calls as simple as possible.
Say we have a straight JSON object such as:
{
"33":"Bed",
"44":"Call",
"66":"Emergency"
}
I take this call from an $xhr request:
getDatasets: function(ctrl) {
$xhr("GET", CURRENT_DATASETS_URL,
function (code, response) {
processDatasets(ctrl, code, response);
},
function (code, response) {
processDatasets(ctrl, code, {});
showError("Unable to load ...");
}
)};
and inside 'processDatasets()' method - manipulate data structure so turns out such as:
self.datasetsArray = [
{label:"Bed",value:33},
{label:"Call",value:44},
{label:"Emergency",value:66}
]
We can render a select list easily with:
<select name="dataset" ng:model="form.dataset" required
ng:options="ds.value as ds.label for ds in datasetsArray">
</select>
Giving us the labels and values needed.
Another challenge for this came up as wanting to utilize groups for values as well. For example, a structure coming in from a service call would come back as:
{
"MainMenu": {"Menu Item 1": 5},
"AlertMenu": {"Alert Item 1": 9,
"Alert Item 2": 2,
"Alert Item 3": 7,
"Alert Item 4": 23
},
"TrackMenu": {"Track Item 1": 55,
"Track Item 2": 1,
"Track Item 3": 8,
"Track Item 4": 6,
"Track Item 5": 10,
"Track Item 6": 3
}
}
Manipulating this structure in our callback from the service (like above), we create an array such as:
var menuGroups = [
{group:"MainMenu", label:"Menu Item 1", value:5},
{group:"AlertMenu", label:"Alert Item 1", value:9},
{group:"AlertMenu", label:"Alert Item 2", value:2},
...
{group:"TrackMenu", label:"Track Item 1", value:55},
{group:"TrackMenu", label:"Track Item 1", value:1},
...
]
We can now use this to create a select menu with the 'optgroup' already in place:
<select name="menuPage" ng:model="form.menuPage" ng:format="number" required
ng:options="mp.value as mp.label group by mp.group for mp in menuGroups">
<option></option>
</select>
** Updated for changes in form processing with angular 0.10.3+.
