It does not look like a variable defined as indexVar was meant to be used as part of another expression.
e.g. this works
<aura:iteration items="{!v.contacts}" var="item" indexVar="index">
{!index} : {!item.FirstName}<br/>
</aura:iteration>
I think in your example "item" should be changed from final value to an object which has properties .label and .value, something like this:
<aura:iteration var="item" items="{!v.items}">
<li>
<label class="card-detail-label">{!item.label}</label>
<span class="card-detail-value">{!item.value}</span>
</li>
</aura:iteration>
I read the documentation you mentioned in the comments and it says attribute of type Aura.Component[]
is called a facet. Then I checked the documentation about Component facet and came up with the below working example on how to use the attribute type List
in other attribute of type Aura.Component[]
:
HelloWorld.cmp
<aura:component implements="force:appHostable">
<aura:attribute name="bar" type="Aura.Component[]">
</aura:attribute>
{!v.bar}
</aura:component>
HellWorld.app:
<aura:application extends="force:slds">
<aura:attribute name="foo" type="List" default="['red','blue','green']"/>
<c:HelloWorld>
<aura:set attribute="bar">
<aura:iteration items="{!v.foo}" var="item">
<p><aura:text value="{!item}"></aura:text></p>
</aura:iteration>
</aura:set>
</c:HelloWorld>
</aura:application>
Output:
UPDATE:
I did not work much on Lightning but I was curious on how to solve the issue you are talking about in comments so I came up with this example:
HelloWorld.cmp
<aura:component implements="force:appHostable">
<aura:attribute name="bar" type="Aura.Component[]" access="global">
</aura:attribute>
<aura:attribute name="baz" type="Aura.Component[]" access="global">
</aura:attribute>
<aura:attribute name="componentNumber" type="String" access="global">
</aura:attribute>
Below are the contents of {!v.componentNumber} component: <br></br>
<div style="background-color:red">{!v.bar}</div>
<div style="background-color:yellow">{!v.baz}</div>
<div style="background-color:green">{!v.body}</div>
</aura:component>
HelloWorldApp.app
<aura:application extends="force:slds">
<aura:attribute name="foo1" type="List" default="['red','blue','green']"/>
<aura:attribute name="foo2" type="List" default="['Orange','Apple','Mango']"/>
<c:HelloWorld aura:id="first" componentNumber="1">
<aura:set attribute="bar" >
<aura:iteration items="{!v.foo1}" var="item" indexVar="i">
<p><aura:text value="{! i + ':' + item}"></aura:text></p>
</aura:iteration>
</aura:set>
</c:HelloWorld>
<c:HelloWorld aura:id="second" componentNumber="2">
<aura:set attribute="bar" >
<aura:iteration items="{!v.foo2}" var="item" indexVar="i">
<p><aura:text value="{! i + ':' + item}"></aura:text></p>
</aura:iteration>
</aura:set>
</c:HelloWorld>
<div></div>
<ui:button label="Update first component with second component body"
press="{!c.updateFirstCmp}"/>
</aura:application>
HelloWorldAppController.js:
({
updateFirstCmp : function(component, event, helper) {
debugger;
var secondCmpBdy = component.find('second').get('v.bar');
// Setting the attribute of type Aura.Component[] of first HelloWorld Component from
// second HelloWorld component attribute of type Aura.Component[]
component.find('first').set('v.baz',secondCmpBdy);
// Setting the body(type Aura.Compoent[] as per docs) of first HelloWorld Component
// from second HelloWorld component attribute of type Aura.Component[]
component.find('first').set('v.body',secondCmpBdy);
}
})
Output:
After clicking on the button: (second component still exists on the page while the content is copied to first component)
I am learning a lot from this question :)
Best Answer
I needed something similar so I used HTML input components instead of Ui:input components and used the data-selected-Index attribute for storing the index value