我在Zone中有一个from和其他组件。每当Zone刷新时,它也会更改表单组件和其他组件的ID。我在JavaScript中使用组件的id,因此面临问题,因为Zone更改了ID。
有没有办法阻止Tapestry 5中Zone的这种行为。
先谢谢你们。
问候,
答案 0 :(得分:0)
简而言之,没有。根据设计,从AJAX请求返回内容时,ID可以是任何内容。
答案越长,您应该以不同的方式构建代码,并根据区域的内容创建一个组件:
<div t:type="Zone" id="zone" t:id="zone">
<div t:type="MyZoneContent" t:id="myZoneContent" ... />
</div>
然后,确保使用该新组件中的实际客户端ID初始化JS:
public MyZoneContent implements ClientElement {
@Environmental
private JavaScriptSupport renderSupport;
/**
* An id for the component. If not specified, a default is generated.
*/
@Parameter(required = false, defaultPrefix = BindingConstants.LITERAL )
private String idParameter;
private String clientId;
@BeginRender
void setupClientId() {
this.clientId = resources.isBound("id") ? idParameter :
renderSupport.allocateClientId(resources);
}
@AfterRender
void addScript() {
this.renderSupport.addScript("new MyJavascriptClass('%s');",
this.getClientId());
}
@Override
public String getClientId() {
return this.clientId;
}
}
新组件的模板:
<div id="${clientId}" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
<form t:type="Form" ...>
...
</form>
</div>
这样,您将组件的实际客户端ID传递给Javascript初始化程序,因此每次重新加载区域内容时都会重新初始化JS。