Как решить проблему в JSF, когда значения не отправляются для полей, изначально помеченных как Отключенные? - PullRequest
2 голосов
/ 23 марта 2012

У меня есть два раскрывающихся списка на странице, бэк-бэк которой - Request Scoped. Второй раскрывающийся список всегда отключается при первой визуализации страницы. Однако если пользователь переключает первый раскрывающийся список на значение, отличное от значения по умолчанию, включается второй раскрывающийся список. Когда пользователь отправляет форму, я хочу, чтобы мой управляемый компонент RequestScoped увидел значение второго раскрывающегося списка. Однако, очевидно, поскольку второй раскрывающийся список был изначально отключен, его значение не отправляется вместе с формой, хотя при отправке формы раскрывающийся список был включен.

Способ, который я обошел, заключается в сохранении отключенного «состояния» второго раскрывающегося списка в bean-компоненте ViewScoped. Таким образом, когда пользователь изменяет первый раскрывающийся список на значение, отличное от значения по умолчанию, может сработать actionListener, который обновит значение bean-компонента ViewScoped, связанного со вторым раскрывающимся списком (изменив его состояние на не отключенное).

Это лучший способ справиться с этой ситуацией? Или есть лучший способ?

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Это действительно самый вменяемый подход.

Альтернативой, если вам действительно нужно, чтобы ваш компонент был в области запроса, является повторное определение состояния disabled второго выпадающего списка в (post) конструкторе компонента на основе представленное значение первого выпадающего списка, которое вы можете найти в карте параметров запроса (или просто позволить JSF установить его на @ManagedProperty). Вам нужно только вручную повторить преобразование / проверку JSF, если это необходимо.

Предположим, что второе раскрывающееся меню больше не следует отключать, когда переданное значение первого раскрывающегося списка равно строковому значению foo и что идентификатор клиента первого раскрывающегося списка равен form:dropdown1:

public Bean() {
    this.dropdown2disabled = !"foo".equals(FacesContext.getCurrentInstance()
        .getExternalContext().getRequestParameterMap().get("form:dropdown1"));
}

Но, как вы узнали, боб с областью видимости легче.

В качестве еще одной альтернативы, вы можете использовать Tomahawk's <t:saveState> для хранения одного свойства непосредственно в состоянии просмотра. Добавьте это куда-нибудь к представлению:

<t:saveState value="#{bean.dropdown2disabled}" />

Это приведет к меньшему размеру состояния просмотра, чем при использовании bean-объекта с областью видимости.

0 голосов
/ 19 февраля 2015

У меня была похожая проблема. Я в конце концов решил это с помощью «фальшивых» отключен.

<div style="position:relative">
    <p:inputText styleClass="ui-state-disabled">

    <!-- fake-disable input field -->
    <div style="position:absolute; top:0; left:0; width:100%; height:100%;"/>
</div>

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

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