2012-06-06 152 views
0

所以,我想摆脱这里的挂毯循环。如何摆脱Tapestry循环?

这是我的 - 更多或less-简化方案:

<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> 

我不希望拥有的是: 挂毯循环遍历firstValue所有条目 - 然后通过secondSource所有条目循环。我不想在fristValue的循环中循环遍历secondSource,因为它会迭代secondSource中的所有条目 - 我只想一次执行1次迭代。

我想要的是: 挂毯进入了firstValue循环,做一些印刷或什么的,然后在第一次迭代之后休息和跳进secondSource做的第一迭代。完成后,它跳回到firstValue并重复这些步骤。 这是Java中的“break”。会做。

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

但它必须以某种方式可能。我无法想象我是唯一一个试图做到这一点的人。

回答

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 
} 
+0

是的,非常感谢,这很神奇。我所要做的就是玩弄循环索引。 – dave

0

我的猜测是,你有三个数据源,并试图输出三列,是吗?

有时你必须改变你的数据一点点:例如,你可能需要做一些工作,一个值从每三个输入转换成一个单一的值:

public class Row { 

    Object col1, col2, col2; 

} 

在Java代码,你会建立一个Row对象列表。

在您的模板中,您遍历Row对象,呈现col1​​,col2和col3属性。

(在Tapestry 5.3及以上,公共场可以被视为一个属性。)

我已经使用类似的技术来输出日历,其可以是非常棘手的条件语句使用来管理等的内部模板。

记住控制器在MVC中的作用:其作业为调解模型和视图之间的;有时会包含模型数据的一些简单转换以适应视图。

+0

我不会说输出将会是一个基于列的输出,它更像是一个“混合物” - 正如你所说 - 三个数据源。 – dave

+0

但是你是对的,也许最好先将必要的值合并到一个新的数据结构中,然后渲染这个数据结构,而不是完成所有这些循环和条件测试。 – dave