多次使用包含区域的自定义组件

时间:2011-08-29 20:08:47

标签: components tapestry zone

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

这个问题的原因很简单,正如我们所看到的,如果我们在同一页面上多次使用此组件,那么区域ID将不是唯一的,并且具有相同id的多个区域将出现在页。

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

提前感谢您的想法。

1 个答案:

答案 0 :(得分: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使用第一个封闭区作为要更新的元素。

另请查看the Ajax and Zones section in the docs,其中详细介绍了其中一些内容。