我在区域内有一个 from 和其他组件。每当 Zone 刷新时,它也会更改表单组件和其他组件的 ID。我在 JavaScript 中使用组件的 ID,因此面临问题,因为 Zone 更改了 ID。
有什么办法可以阻止 Tapestry 5 中 Zone 的这种行为。
在此先感谢各位。
问候,
简而言之,没有。从 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。