我有一个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强制进行更新,但这是一次绝望的尝试,以至于我试图从完全不同的情况下进行复制而没有成功。我认为这甚至不值得分享,但是如果您有不同的看法,请告诉我。
这就是我现在能想到的所有尝试。我不知道我还能尝试什么,很想听听您的建议。