使用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唯一。
提前感谢您的想法。
答案 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,其中详细介绍了其中一些内容。