Loops 如何打破挂毯循环?

Loops 如何打破挂毯循环?,loops,break,tapestry,Loops,Break,Tapestry,所以,我试图打破这里的tapestry循环 这是我或多或少简化的场景: <ul> <t:loop source="firstSource" value="firstValue"> <li> <t:loop source="firstValue" value="secondValue"> <p>${secondValue}</p&

所以,我试图打破这里的tapestry循环

这是我或多或少简化的场景:

<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>
  • ${secondValue}

    ${thirdValue}

我不想要的是: Tapestry遍历firstValue中的所有条目,然后遍历secondSource中的所有条目。我不想在fristValue循环中迭代secondSource,因为这将迭代secondSource中的所有条目——我只想一次迭代一次

我想要的是: Tapestry进入firstValue的循环并进行一些打印或其他操作,然后在第一次迭代后中断并跳入secondSource进行第一次迭代。完成后,它跳回firstValue并重复这些步骤。 在Java中,“break;”就是这样做的

我在Tapestry文档中以及他们的论坛中都没有找到关于如何做到这一点的线索


但这在某种程度上是可能的。我无法想象我是唯一一个尝试这样做的人。

在逻辑周围放一个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>

我猜您有三个数据源,并试图输出三列,对吗

有时您必须稍微转换数据:例如,您可能需要做一些工作,将三个输入中的一个值转换为单个值:

public class Row {  

  Object col1, col2, col2;

}
在Java代码中,您将建立一个行对象列表

在模板中,迭代行对象,呈现col1、col2和col3属性

(在Tapestry 5.3及更高版本中,公共字段可以视为属性。)

我使用了类似的技术来输出日历,在模板中使用条件等来管理日历可能非常棘手


记住MVC中控制器的角色:它的工作是在模型和视图之间进行调解;有时,这包括一些简单的模型数据转换,以适应视图。

是的,谢谢,这非常神奇。我所要做的就是玩弄循环索引。我不会说输出将是基于列的,它更像是三个数据源的“混合物”——正如你所说的那样。但你是对的,也许最好先将必要的值组合到一个新的数据结构中,并呈现这个数据结构,而不是执行所有这些循环和条件测试。
public class Row {  

  Object col1, col2, col2;

}