所以,我试图在这里打破挂毯循环。
这是我的更多或更简化的场景:
<ul>
<t:loop source="firstSource" value="firstValue">
<li>
<t:loop source="firstValue" value="secondValue">
<p>${secondValue}</p>
</t:loop>
<t:loop source="secondSource" value="thirdValue">
<p>${thirdValue}</p>
</t:loop>
</li>
</t:loop>
</ul>
我不想要的是: Tapestry循环遍历firstValue中的所有条目 - 然后循环遍历secondSource中的所有条目。我不想在fristValue的循环中迭代secondSource,因为这将迭代secondSource中的所有条目 - 我只想一次进行1次迭代。
我想要的是: Tapestry进入firstValue的循环并进行一些打印或其他任何操作,然后在第一次迭代后中断并跳转到secondSource进行第一次迭代。完成后,它跳回到firstValue并重复这些步骤。 这就是Java中的&#34; break;&#34;会做的。
我没有在Tapestry文档中找到关于如何执行此操作的线索,也没有在他们的论坛中找到线索。
但必须以某种方式实现。我无法想象我是唯一一个试图这样做的人。
答案 0 :(得分:1)
只需在逻辑上放置一个if语句,可能使用索引变量:
<t:loop source="firstSource" value="firstValue">
<li>
<t:loop source="firstValue" value="secondValue" index="firstValueIndex">
<t:if test="firstCondition">
<p>${secondValue}</p>
</t:if>
</t:loop>
<t:loop source="secondSource" value="thirdValue">
<t:if test="secondCondition">
<p>${thirdValue}</p>
</t:if>
</t:loop>
</li>
</t:loop>
在Java页面中:
@Property
private int firstValueIndex;
public boolean getFirstCondition() {
// logic to determine whether to break out
return firstValueIndex == 0;
}
public boolean getSecondCondition() {
// logic
}
答案 1 :(得分:0)
我的猜测是你有三个数据源并且正在尝试输出三列,这是对的吗?
有时您必须稍微转换数据:例如,您可能需要做一些工作才能将三个输入中的每一个中的一个值转换为单个值:
public class Row {
Object col1, col2, col2;
}
在Java代码中,您将构建一个Row对象列表。
在模板中,迭代Row对象,渲染col1,col2和col3属性。
(在Tapestry 5.3及更高版本中,可以将公共字段视为属性。)
我使用了类似的技术来输出日历,使用模板内的条件等进行管理可能非常棘手。
记住Controller在MVC中的角色:它在模型和视图之间调解的工作;有时包括一些模型数据的简单转换以适应视图。