0

所以,我想在这里打破挂毯循环。

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

<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 中的“中断”;会做。

我没有在 Tapestry 文档中找到有关如何执行此操作的线索,也没有在他们的论坛中找到线索。

但它必须以某种方式成为可能。我无法想象我是唯一一个尝试这样做的人。

4

2 回答 2

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
}
于 2012-06-06T17:40:05.660 回答
0

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

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

public class Row {  

  Object col1, col2, col2;

}

在您的 Java 代码中,您将构建一个 Row 对象列表。

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

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

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

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

于 2012-06-06T19:09:34.360 回答