区域组件更改Tapestry 5中其他组件的ID

时间:2011-12-22 10:06:41

标签: tapestry zone

我在Zone中有一个from和其他组件。每当Zone刷新时,它也会更改表单组件和其他组件的ID。我在JavaScript中使用组件的id,因此面临问题,因为Zone更改了ID。

有没有办法阻止Tapestry 5中Zone的这种行为。

先谢谢你们。

问候,

1 个答案:

答案 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。