窗体内的挂毯刷新组件

时间:2019-04-03 16:54:51

标签: java html tapestry rerender

我有一个zone,其中包含一个form,其中包含(其中包括)一个自定义组件(准确地说是container),其中包含一个自定义下拉组件。该下拉列表包含一个SelectModel,其中包含可以选择的各种元素(从数据库中提取)。在事件(也以表格形式发生)上,数据库将更改,因此该模型也应更改。模型本身是在自定义container(在setupRender中)中创建的。现在的问题是,如何在事件中重新呈现组件,以便更新可选值?


我试图创建一个说明这种情况的示例。请注意,此操作已大大简化-如果有什么地方似乎没有任何意义,请告诉我。

main.tml

<!-- ... -->
<div t:type="zone" t:id="editZone">
    <form t:type="form" t:id="editForm">
        <!-- ... -->
        <t:SubEdit t:id="subEdit" id="subEdit" />
        <!-- ... -->
    </form>
</div>

subEdit.tml

<t:container ...>
    <div class="form__row">
        <div t:type="CustomSelectList"
             t:model="values"
             t:id="sub"
             id="sub"/>
    </div>
</t:container>

main.java中:

@Inject
private AjaxResponseRenderer response;
// ...
void onEvent(){
    // do some updates
    updateDatabase();
}

最后在subEdit.java中:

@Property
private SelectModel values;
// ...
void setupRender(){
    values = createValuesFromDatabase();
}

我知道这个版本永远都行不通,因为我什至没有尝试重新渲染subEdit,所以这是我解决这个问题的尝试。

1。在main.tml中添加另一个区域,然后重新渲染

所以在main.tml中,我有:

    <!-- ... -->
        <t:SubEdit t:id="subEdit" id="subEdit" zone="subZone" />
    <!-- ... (Until the very bottom) -->
    <div t:type="zone"
         t:id="subZone"
         id="subZone"/>
</html>

main.java中:

@InjectComponent
private Zone subZone;
// ...
void onEvent(){
    // do some updates
    updateDatabase();
    response.addRender(subZone);
}

但是,这没有效果。我还尝试过将subZone放在subEdit周围,像这样:

<div t:type="zone" t:id="subZone" id="subZone">
    <t:SubEdit t:id="subEdit" id="subEdit" />
</div>

但这引发了异常

org.apache.tapestry5.ioc.internal.util.TapestryException: Form components may not be placed inside other Form components.

2。在subEdit

中添加区域

因此,我这样修改了subEdit.tml

<div t:type="zone" t:id="zone" id="zone"/>
<t:container ...>
    <div class="form__row">
        <div t:type="CustomSelectList"
             t:model="values"
             t:id="sub"
             id="sub"
             zone="zone"/>
    </div>
</t:container>

然后我通过另一个事件处理程序将zone传递回了main(我认为这样做的代码没有多大帮助),并且与事件中的第一种情况类似处理程序,但我再次遇到了异常

org.apache.tapestry5.ioc.internal.util.TapestryException: Form components may not be placed inside other Form components.

3。 JavaScript

我也试图通过JS强制进行更新,但这是一次绝望的尝试,以至于我试图从完全不同的情况下进行复制而没有成功。我认为这甚至不值得分享,但是如果您有不同的看法,请告诉我。


这就是我现在能想到的所有尝试。我不知道我还能尝试什么,很想听听您的建议。

0 个答案:

没有答案