Компонент обновления гобелена внутри формы - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть zone, содержащий form, содержащий (среди прочего) пользовательский компонент (точнее, container), содержащий пользовательский выпадающий компонент. Этот выпадающий список содержит SelectModel, содержащий различные элементы, которые можно выбрать (которые извлекаются из базы данных). В случае события (которое также происходит в форме) база данных изменяется, и, следовательно, эта модель должна измениться. Сама модель создается внутри кастома containersetupRender). Теперь вопрос заключается в том, как мне повторно визуализировать компонент в моем событии, чтобы обновляемые значения обновлялись?


Я попытался создать пример, иллюстрирующий ситуацию. Обратите внимание, что это существенно упрощено - пожалуйста, дайте мне знать, если что-то кажется бессмысленным.

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


Это все попытки, которые я предпринял, о которых я могу думать прямо сейчас. Я не знаю, что еще я мог бы попробовать и хотел бы услышать ваши предложения.

...