Select Command
Select requires APL 1.3 or later. Provide an alternate experience for devices running older versions of APL.
Select a single command from an array of commands and data.
Properties
The Select command has the properties shown in the following table, in addition to the common command properties. Set the type property to Select.
In the following table, the "Default" column shows "Required" for properties that must have a value for the command to run. Otherwise it displays the default value, which might be none.
| Property | Type | Default | Description |
|---|---|---|---|
| commands | Array of Commands | REQUIRED | An ordered list of commands to select from |
| data | Array | [] | A list of data to map against the commands |
| otherwise | Array of Commands | [] | An array of commands to run if no command is selected from the commands array |
When the data array is empty, the Select command runs the first command in the commands array where when evaluates to true.
commands
An array of commands. The first command in the array with a true when clause runs.
data
The array of data to iterate over. During iteration the data-binding context is extended with the following properties:
| Name | Description |
|---|---|
| data | Data assigned from the data array property |
| index | The 0-based index of the current data item |
| length | The total number of data items in the data array |
Note that these properties are set when the data array property contains at least one item.
otherwise
The otherwise commands run when none of the commands in the commands property run. The otherwise commands do not have access to the data property. For example:
{
"type": "Select",
"commands": {
"when": "${data.breed == breed}",
"type": "SetValue",
"property": "text",
"componentId": "${textIdToUpdate}",
"value": "Your dog is ${data.description}"
},
"otherwise": {
"type": "SetValue",
"property": "text",
"componentId": "${textIdToUpdate}",
"value": "Your dog is indescribable!"
},
"data": "${dogBreedData}"
}
Contents of the dogBreedData array:
{
"dogBreedData": [
{
"breed": "Affenpinscher",
"description": "loyal, curious, and amusing"
},
{
"breed": "Bassett Hound",
"description": "endearing with floppy ears"
},
{
"breed": "Beagle",
"description": "happy-go-lucky and cheerful"
}
]
}
In the above example, passing the breed "Mixed Mutt" falls throught to the otherwise and updates the provided Text component text with "Your dog is indescribable!"
The otherwise property provides fallback behavior for when nothing from the data array matches.
Select command examples
Select command with no data property
In this example, assume age is 7. The command iterates the commands array until it reaches the third command. The when statement for this command evaluates to true, so Select runs the SetValue command and updates the specified text property to the value "Kid".
{
"type": "Select",
"commands": [
{
"when": "${age < 2}",
"type": "SetValue",
"property": "text",
"value": "Infant",
"componentId": "${textIdToUpdate}"
},
{
"when": "${age < 5}",
"type": "SetValue",
"property": "text",
"value": "Toddler",
"componentId": "${textIdToUpdate}"
},
{
"when": "${age < 13}",
"type": "SetValue",
"property": "text",
"value": "Kid",
"componentId": "${textIdToUpdate}"
},
{
"when": "${age < 18}",
"type": "SetValue",
"property": "text",
"value": "Teen",
"componentId": "${textIdToUpdate}"
},
{
"type": "SetValue",
"property": "text",
"value": "Adult",
"componentId": "${textIdToUpdate}"
}
]
}
Select command with the data array
When you provide the data array, the Select command checks each command in the commands array for a true when clause one time per item in the data array. The data-binding context is extended by binding data, index, and length properties. The Select command finishes after it runs a single command; it does not continue iterating over the data array.
In this example, assume age is 17. The command iterates through data array. The when statement for the command evaluates to true for the data provided in the fourth item (17 < 18), so Select stops iterating through the data array and runs the SetValue command, which updates the specified text property to "Your category is Teen".
{
"type": "Select",
"commands": {
"when": "${!data.until || age < data.until}",
"type": "SetValue",
"property": "text",
"value": "Your category is ${data.category}",
"componentId": "${textIdToUpdate}"
},
"data": [
{
"until": 2,
"category": "Infant"
},
{
"until": 5,
"category": "Toddler"
},
{
"until": 13,
"category": "Kid"
},
{
"until": 18,
"category": "Teen"
},
{
"category": "Adult"
}
]
}
You can combine multiple commands with a data array. Select still runs only a single command in the commands array. For example:
{
"type": "Select",
"commands": [
{
"when": "${searchCategory == data.category && data.rating >= 8.0}",
"type": "SetValue",
"property": "text",
"componentId": "${textIdToUpdate}",
"value": "Here's a great movie for your category: <em>${data.title}</em>"
},
{
"when": "${searchCategory == data.category}",
"type": "SetValue",
"property": "text",
"componentId": "${textIdToUpdate}",
"value": "Here's an okay movie for your category: <em>${data.title}</em>"
}
],
"data": "${movieData}"
}
In this example, movieData is bound to an array of movies sorted by category and rating, with the highest rated movies first:
{
"movieData": [
{"title":"Avatar","category":"Adventure","rating":7.8},
{"title":"Aladdin","category":"Adventure","rating":7.1},
{"title":"Coco","category":"Animation","rating":8.4},
{"title":"Toy Story 4","category":"Animation","rating":8},
{"title":"The Lion King","category":"Animation","rating":7}
]
}
If SearchCategory is "Animation", Select iterates until it reaches the third item in data, which matches both of the criteria in the first when statement. The first command then runs and updates the text property of the movieResultTextComponent component with the text "Here's a great movie for your category: Coco".
If SearchCategory is "Adventure", Select chooses the first item in data since this item matches the criteria for the second when statement. The second command then runs and updates the text property of movieResultTextComponent to "Here's an okay movie for your category: Avatar".
Related topics
Last updated: frontmatter-missing