Отображение форм только для чтения (значения отображаются в виде текста вместо отключенных элементов управления вводом) с помощью JSF? - PullRequest
1 голос
/ 07 января 2012

У меня есть форма ввода данных, где пользователь вводит много данных. Когда пользователь заходит на страницу для просмотра существующих данных, страница должна отображаться в режиме только для чтения (все значения отображаются в виде текста), когда он нажимает кнопку «Редактировать», должна отображаться обычная форма со всеми элементами управления вводом, чтобы пользователь мог изменить и сохранить данные.

Мы используем JSF 2.0 с библиотекой PrimeFaces. Легко добиться вышеуказанного поведения для текстового поля и текстовой области, но не для флажков, мульти-выбора, радио, ..... элементов управления. Есть ли какой-нибудь простой способ для достижения вышеупомянутого поведения вместо написания нашего собственного кода (который может содержать много строк, что делает уродливую поддержку бина-кода)

Спасибо за вашу помощь ...

Ответы [ 2 ]

4 голосов
/ 08 января 2012

Я не уверен, почему вы думаете, что для этого вам нужен дополнительный бина-код. У вас уже есть все необходимые значения в компоненте поддержки. Ваша проблема больше в представлении этих ценностей. Просто отобразите их в нужном формате, написав соответствующий код вида. Возможно, вы думали, что это слишком сложный путь.

Вместо логического флажка выбора можно отобразить, например, значение «Да» или «Нет».

<h:selectBooleanCheckbox value="#{bean.checked}" rendered="#{bean.edit}" />
<h:outputText value="#{bean.checked ? 'Yes' : 'No'}" rendered="#{not bean.edit}" />

Вместо выбора одного меню / радио вы можете просто отобразить значение в выходном тексте.

<h:selectOneMenu value="#{bean.selectedItem}" rendered="#{bean.edit}">
    <f:selectItems value="#{data.availableItems}" />
</h:selectOneMenu>
<h:outputText value="#{bean.selectedItem}" rendered="#{not bean.edit}" />

Вместо списка выбора / флажка можно просто отобразить, например, все значения, разделенные запятой в цикле.

<h:selectManyListbox value="#{bean.selectedItems}" rendered="#{bean.edit}">
    <f:selectItems value="#{data.availableItems}" />
</h:selectManyListbox>
<h:panelGroup rendered="#{not bean.edit}">
    <ui:repeat value="#{bean.selectedItems}" var="selectedItem" varStatus="loop">
        #{selectedItem}#{not loop.last ? ', ' : ''}
    </ui:repeat>
</h:panelGroup>

Вы можете обернуть все это в файл тегов или в составной файл, чтобы свести к минимуму шаблон и повторение кода.

0 голосов
/ 07 января 2012

Я сделал это в моем последнем проекте, используя составные компоненты, которые имеют атрибут «Предварительный просмотр», и в реализации я отображаю текст, когда этот атрибут равен true, и реальный (редактирование), когда атрибут равен false. Для флажка в режиме предварительного просмотра вы можете показать сам флажок, но отключен, для радио - показать выбранный элемент.

Библиотека MyFaces Tomahawk [1] содержит расширенную версию стандартных компонентов, которая добавляет атрибут displayValueOnly для этой цели. Это может помочь вам (я не использовал их).

[1] - http://myfaces.apache.org/tomahawk-project/tomahawk20/index.html

...