PartialFor
Extension of Tapestry's For component which allows for more efficient looping over lists of elements during ajax request/responses. The parameters provided by For are left out of this spec, for those values/meanings see the referenced tapestry page.
This component will not render the contents of a particular loop during an ajax request if the key value of the element/component doesn't exist as an updateComponent to the original request. The values will still be iterated over, just not rendered.
Parameters
Name | Type | Direction | Required | Default | Description |
---|---|---|---|---|---|
keyProvider | IKeyProvider | in | no | IdentityKeyProvider | Converter from elements to keys. Used by tree to identify node ids. |
partialBlock | PartialRenderBlock | in | no | Provides ability to have callbacks performed on a component during partial renders in case component requires maintaing some sort of internal state even if each item specified in the source isn't actually rendered. | |
evenOdd | org.apache.tapestry.bean.EvenOdd | in | no | The evenodd bean that should be incremented for each loop iteration, mainly used to maintain state on non-rendered items. |
Body: rendered
Informal parameters: allowed
Reserved parameters:
Examples
Using the refresh/effects demo page
HTML template
<div id="countries"> <span jwcid="foreachItem" > <div jwcid="@Any" class="ognl:beans.evenOdd.next" id="ognl:currItem.toString()" > <div> <a jwcid="linkToggle" class="toggle"> <span jwcid="@Insert" value="ognl:currSelected ? 'Hide' : 'Details'"/> </a> <span jwcid="@Insert" value="ognl:currItem.displayCountry" class="ognl:currSelected ? 'detailHeading' : 'heading'"/> </div> <span jwcid="@If" condition="ognl:currSelected"> <div class="countryDetail"> <div class="flag"> <img jwcid="flagImage" width="34" height="18"/><br/> <span jwcid="@Insert" value="ognl:currItem.country"/> </div> <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In consequat lectus a eros. Vestibulum tortor. Cras sapien. Morbi sed ipsum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Fusce aliquam auctor tortor.</p> <p style="color: #666">Rendered on: <span jwcid="insertTime"/>.</p> </div> </span> </div> </span> </div>
Page specification
<component id="foreachItem" type="tacos:PartialFor"> <binding name="source" value="items"/> <binding name="value" value="currItem"/> <binding name="evenOdd" value="ognl:page.beans.evenOdd" /> </component>
Java sources
public abstract class PartialPrototype extends BasePage { public static final DateFormat DATE_FORMAT = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.LONG); public List getItems() { Set countries = new HashSet(); Locale[] locales = Locale.getAvailableLocales(); List items = new ArrayList(locales.length); for (int i = 0; i < locales.length; i++) { Locale l = locales[i]; if (!"".equals(l.getDisplayCountry()) && !countries.contains(l.getCountry())) { items.add(l); countries.add(l.getCountry()); } } Collections.sort(items, new Comparator() { public int compare(Object o1, Object o2) { Locale l1 = (Locale) o1; Locale l2 = (Locale) o2; return l1.getDisplayCountry().compareTo(l2.getCountry()); } }); return items; } public void toggleItem(IRequestCycle cycle) { String item = (String) cycle.getListenerParameters()[0]; Set s = getSelectedItems(); if (s.contains(item)) { s.remove(item); } else { s.add(item); } setSelectedItems(s); AjaxWebRequest ajax = (AjaxWebRequest)cycle.getAttribute(AjaxWebRequest.AJAX_REQUEST); if (ajax != null) ajax.addStatusResponse("File selected.."); } public boolean isCurrSelected() { return getSelectedItems().contains(getCurrItem().toString()); } public abstract Locale getCurrItem(); public abstract Set getSelectedItems(); public abstract void setSelectedItems(Set selectedItems); }