JSF2, частичное обновление Ajax и повторение пользовательского интерфейса - отправляйте и обновляйте динамически добавленные текстовые поля - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть приложение JSF2 и страница со следующим кодом:

<h:inputText id="someInput" required="true" />

<p:outputPanel id="itemsPanel">
    <ui:repeat var="i" value="#{myBean.itemIndices}" id="items">
        <h:inputText 
            id="itemInput" 
            value="#{myBean.dataItems[i]}" 
            />
        <h:panelGroup 
            layout="block" 
            styleClass="clear" 
            rendered="#{((i+1) % 10 == 0)}" 
            />
    </ui:repeat>
</p:outputPanel>
<br/>
<p:commandButton
    classStyle="btn" 
    value="Add Row"
    actionListener="#{myBean.increaseItemsCount}" 
    update="itemsPanel" 
    immediate="false"
    ajax="true"
    />

ui:repeat динамически отображает число, если текстовые поля зависят от свойств itemIndices и dataItems.Кнопка «Добавить строку» вызывает метод, который динамически увеличивает количество itemIndices и dataItems, поэтому появляются дополнительные текстовые вводы.

Текущий код не будет работать, если в текстовом поле нет значения someInput, поскольку запрос AJAX также проверяет форму и проверка завершается неудачно.Нажатие кнопки в этом случае не имеет никакого визуального эффекта, даже не дает пользователю понять, что проверка не прошла (потому что я обновляю только itemsPanel).

Если я поменяю кнопку на immediate="true", то проблема проверки больше не будет.К сожалению, я хочу иметь возможность восстанавливать значения динамических полей ввода, которые пользователь мог изменить до добавления новой строки.Атрибут immediate="true" приводит к тому, что форма не отправляется на сервер, поэтому введенные пользователем данные не будут сохраняться.

Возможным решением этой проблемы может быть добавление атрибута process="all dynamic input ids csv" к командной кнопке и установка атрибута immediate обратно на true.Это заставит сервер проверять только входные данные, указанные в атрибуте процесса, и они будут сохранены.Проблема здесь в том, что эти входные идентификаторы динамически генерируются JSF, и я не могу придумать правильный способ получить их как CSV.Я также не предпочел бы решение для динамической генерации идентификаторов в myBean, основанное на предположениях о том, как JSF будет выводить их.

Все предложения будут высоко оценены.

1 Ответ

2 голосов
/ 10 ноября 2011

Вы можете использовать process="itemsPanel".

<p:commandButton
    classStyle="btn" 
    value="Add Row"
    actionListener="#{myBean.increaseItemsCount}" 
    process="itemsPanel" 
    update="itemsPanel" 
    ajax="true"
    />

Вы должны только переместить командную кнопку в <h:outputPanel id="itemsPanel">.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...