У меня есть 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, но это была такая отчаянная попытка, что я попытался скопировать из совершенно другой ситуации без каких-либо успехов. Я не думаю, что это даже стоит поделиться, но если вы думаете по-другому, пожалуйста, дайте мне знать.
Это все попытки, которые я предпринял, о которых я могу думать прямо сейчас. Я не знаю, что еще я мог бы попробовать и хотел бы услышать ваши предложения.