Am not sure if it will solve your problem, but Foreach is deprecated.
Try using For instead, may be it will work...
Wouter De Vaal:
Hi,
I have a strange problem with a foreach component within a block that
only gets called once, but the block renders multiple times. This code
worked in tapestry 3, but gives an overflow in tapestry 4 beta 6,
because the foreach source doesn't get reevaluated I think.
Regards,
Wouter
PS: I've created a skeleton test page/class to test it:
html:
<html>
<body>
<comp jwcid="@RenderBlock" block="ognl:components.subMenuItems"/>
<comp jwcid="[EMAIL PROTECTED]">
Blah:<br/>
<comp jwcid="@Foreach" source="ognl:menuItems" value="ognl:menuItem">
<comp jwcid="@Insert" value="ognl:menuName"/><br/>
<comp jwcid="@Conditional" condition="ognl:hasAvailableSubItems">
<comp jwcid="@Insert" value="ognl:test"/>
<comp jwcid="@RenderBlock"
block="ognl:components.subMenuItems"/>
</comp>
</comp>
</comp>
</body>
</html>
Page file:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification PUBLIC
"-//Apache Software Foundation//Tapestry Specification 4.0//EN"
"http://jakarta.apache.org/tapestry/dtd/Tapestry_4_0.dtd">
<page-specification class="EditMenuItemTest">
</page-specification>
Java class:
import java.util.ArrayList;
import java.util.List;
import org.apache.tapestry.event.PageBeginRenderListener;
import org.apache.tapestry.event.PageEvent;
import org.apache.tapestry.html.BasePage;
public abstract class EditMenuItemTest extends BasePage implements
PageBeginRenderListener {
public class MenuItem {
private String name;
private List<MenuItem> subItems = new ArrayList<MenuItem>();
public MenuItem(String name) {
this.name = name;
}
public List<MenuItem> getSubItems() {
return subItems;
}
public void setSubItems(List<MenuItem> subItems) {
this.subItems = subItems;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
public void pageBeginRender(PageEvent evt) {
// create some menu items
MenuItem root = new MenuItem("root");
MenuItem a = new MenuItem("a");
MenuItem b = new MenuItem("b");
MenuItem c = new MenuItem("c");
MenuItem aa = new MenuItem("aa");
MenuItem ab = new MenuItem("ab");
MenuItem ac = new MenuItem("ac");
MenuItem aba = new MenuItem("aba");
MenuItem abb = new MenuItem("abb");
root.getSubItems().add(a);
root.getSubItems().add(b);
root.getSubItems().add(c);
c.getSubItems().add(aa);
c.getSubItems().add(ab);
c.getSubItems().add(ac);
ab.getSubItems().add(aba);
ab.getSubItems().add(abb);
setRootMenuItem(root);
}
public abstract MenuItem getRootMenuItem();
public abstract void setRootMenuItem(MenuItem root);
public abstract MenuItem getMenuItem();
public List<MenuItem> getMenuItems() {
if (getMenuItem() == null) {
System.out.println("get menu items with null called,
returning: " + getRootMenuItem().getSubItems());
return getRootMenuItem().getSubItems();
} else {
System.out.println("get menu items called, returning: " +
getMenuItem().getSubItems());
return getMenuItem().getSubItems();
}
}
public String getMenuName() {
System.out.println("get menu name called, current menu item: "
+ getMenuItem());
return getMenuItem().getName();
}
public String getTest() {
System.out.println("test called, current menu item: " + getMenuItem());
return "";
}
public boolean isHasAvailableSubItems() {
System.out.println("available:" + getMenuItem().getSubItems());
return (getMenuItem().getSubItems().size() > 0);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]