Как динамически заполнить список выбора правой стороны значений
Я использую компонент rich:popuppanel и у меня возникают проблемы с заполнением значений в списке выбора.
Мое требование, как показано ниже.
Заполните расширенную таблицу данных
Выберите строку с помощью флажка - идентификатор пользователя в этой строке будет передан компоненту EJB.
Нажмите кнопку назначения
Всплывающая панель должна открыться с списком выбора, содержащим всех пользователей и назначенных пользователей
Проблема в том, что вызов getAllUsers() возвращает всех пользователей, и левая часть списка выбора заполнена правильно. Но getAssignedUsers() не вызывается вообще. Так что правая часть списка выбора всегда пуста.
Код XHTML, как показано ниже.
<h:form id="audit">
...
<h:commandButton id="Assign" value="Assign"
immediate="true" action="#{userBean.getSelectedUsers}">
<f:ajax execute="@this" render="popupScript" />
</h:commandButton>
<h:panelGroup id="popupScript">
<h:outputScript rendered="#{userBean.assignClicked}">
#{rich:component('assignUser')}.show();
</h:outputScript>
</h:panelGroup>
...
</h:form>
<rich:popupPanel id="assignUser" autosized="true" resizeable="false">
<f:facet name="header">
<h:outputText value="#{msg.assignPopupHeader}">
</h:outputText>
</f:facet>
<h:form name="assign" id="assign">
<h:panelGrid cellspacing="5" id="popupGrid">
<a4j:outputPanel id="a4jPanel">
<rich:pickList value="#{userBean.assignedUsers}"
showButtonsLabel="false" sourceCaption="Available Users"
align="center" targetCaption="Assigned Users" listWidth="165px"
listHeight="100px" orderable="true" addText=">" removeText="<">
<f:selectItems value="#{userBean.allUsers}" />
</rich:pickList>
</a4j:outputPanel>
<center>
<h:panelGrid columns="2" cellspacing="3" cellpadding="4">
<a4j:commandButton id="assign" value="#{msg.userAssign}"
action="#{userBean.assignUser}"/>
<h:commandButton value="#{msg.userCancel}"
onclick="#{rich:component('assignUser')}.hide();return false">
</h:commandButton>
</h:panelGrid>
</center>
</h:form>
</rich:popupPanel>
Насколько я понимаю, проблема заключается в объеме бина. Мой bean-компонент имеет область просмотра, поэтому данные на левой и правой боковых панелях предварительно заполняются при инициализации bean-компонента.
@PostConstruct
public void init() {
setAllUsers(userService.getAllUsers());
setAssignedUsers(userService.getAllAssignedUsers(userBean.getSelectedIdforAssign()));
}
Я попытался вызвать setAssignedUsers() с жестко закодированным идентификатором в самой init(). Работает нормально. Мне нужен способ динамической передачи идентификатора и вызова getAssignedUsers().
Подскажите, пожалуйста, как это сделать и как повторно отобразить список выбора, когда открыто всплывающее окно.
Спасибо!
1 ответ
Кажется, проблема заключается в выборе пользователей. Без кода таблицы и флажков я не могу сказать, правильно ли вы это делаете или нет. ViewScope должно быть достаточно.
<f:ajax execute="@this" render="popupScript" />
Это может быть неправильно, хотя. Вероятно, ваши флажки никогда не будут оценены. Попробуйте изменить @this на @form.