2

我在使用 Tapestry 5.2.0 时遇到了一个问题:多次使用包含区域的组件。

此时,该组件在同一页面上使用了 3 次,但只有一个实例运行良好。与组件关联的 tml 看起来是这样的:

<t:container xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
    <t:zone t:id="myZoneId">
        <!-- component's zone content goes there -->
    </t:zone>
</t:container>

造成这个问题的原因很简单,我们可以看到,如果我们在同一个页面上多次使用这个组件,那么zone id就不会唯一,页面中会出现多个相同id的zone。

现在这是我的问题:当组件被使用一次或多次且不使用容器外的区域时,可以使用什么方法使组件中的区域 id 唯一。

提前感谢您的想法。

4

1 回答 1

2

您必须手动处理区域 ID,否则它们都会以自动生成的客户端 ID 结束。

在您的 TML 中,您也可以指定id属性(没有t:命名空间),然后在呈现的标记中按原样使用:

<t:zone t:id="myZoneId" id="${zoneClientId}">
    ...
</t:zone>

如果您的组件中存在某种唯一值(例如 ID),请使用它来构造客户端 ID:

@Parameter
private MyType myParam;

public String getZoneClientId() {
    return "myZone-" + myParam.getId();
}

zone然后,您可以对更新区域的链接或表单上的参数使用相同的 getter 方法:

<a t:type="ActionLink" t:zone="prop:zoneClientId">...</a>

如果链接或表单包含在区域本身内,则有一个更简单的解决方案:

<t:zone t:id="myZoneId">
   ...
   <a t:type="ActionLink" t:zone="^">...</a>
</t:zone>

特殊值^使 Tapestry 使用第一个封闭区域作为要更新的元素。

另请查看文档中的 Ajax 和 Zones 部分,其中更详细地解释了其中的一些内容。

于 2011-08-31T10:44:57.637 回答