Загрузите все компоненты JSF на странице как условные тексты - PullRequest
1 голос
/ 01 марта 2012

В моем приложении JSF2 (с Facelets) требуется, чтобы многие страницы открывались в режиме ReadOnly / Editable. Ниже приводится точное требуемое поведение:

  1. Страница сначала загружается в режиме ReadOnly, когда все компоненты страницы отображаются в виде текстов.
  2. Пользователь нажимает кнопку «Редактировать», чтобы открыть страницу в редактируемом режиме.
  3. В редактируемом режиме все компоненты видны и ими можно манипулировать.
  4. Пользователь вносит изменения и нажимает кнопку Сохранить, которая загружает страницу обратно в режиме ReadOnly (т. Е. Все тексты и никакие компоненты).

Если у меня есть TextArea на странице, в режиме ReadOnly я не хочу, чтобы он был отключен / readOnly, вместо этого я хочу использовать outputText. В редактируемом режиме он должен вести себя как TextArea.

Что было бы подходящим способом для достижения этой цели, учитывая, что мне нужно такое поведение на нескольких страницах приложения.

Должен ли я написать два компонента (textArea и outputText) и манипулировать их отображаемым свойством для отображения одного.

Можно ли каким-то образом управлять поведением элементов в JSF и отображать тексты вместо самих компонентов (возможно, путем написания собственного рендерера)?

Заранее большое спасибо за ваш вклад.

Ответы [ 2 ]

1 голос
/ 03 марта 2012

Спасибо всем за их вклад ... :-) Привет Обнаружил способ заставить его работать по-другому. Я должен был написать следующее:

  1. Пользовательский тег: все элементы, попадающие в этот тег, будут иметь режим чтения / записи
  2. Пользовательский рендерер: который будет отображать все текстовые поля, выпадающие списки и т.д. на странице, если они попадают под пользовательский тег.

Вот мой XHTML

    <rw:readWrite readOnlyOn="#{!rwBean.editMode}">
        <h:panelGrid columns="2">
            <h:outputLabel value="Booking Center P" />
            <h:selectOneMenu id="bookingCentre" value="#{rwBean.bookingCenter}">
                <f:selectItems value="#{rwBean.bookingCenterList}" />
            </h:selectOneMenu>

            <h:outputLabel value="Account Number 1" />
            <h:inputText id="accountNumber1" value="987654" maxlength="7" />
        </h:panelGrid>
    </rw:readWrite>

Исходя из значения атрибута «readOnlyOn», мой пользовательский тег будет устанавливать атрибут в каждом из его дочерних компонентов. Мой пользовательский рендер будет проверять значение этого атрибута в теге и отображать сам тег или его атрибут «value» условно.

Я реализовал это для всех тегов JSF и PrimeFaces, и мне кажется, что это работает.

0 голосов
/ 01 марта 2012

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

<my:inputTextArea editable="#{bean.editable}" />

, который содержит в случае составного компонента в основном

<h:inputTextArea rendered="#{cc.attrs.editable}" />
<h:outputText rendered="#{!cc.attrs.editable}" />

или в случае файла тега

<c:choose>
    <c:when test="#{editable}"><h:inputTextArea /></c:when>
    <c:otherwise><h:outputText /></c:otherwise>
</c:choose>
...