Как динамически заполнить список выбора правой стороны значений

Я использую компонент rich:popuppanel и у меня возникают проблемы с заполнением значений в списке выбора.

Мое требование, как показано ниже.

  1. Заполните расширенную таблицу данных

  2. Выберите строку с помощью флажка - идентификатор пользователя в этой строке будет передан компоненту EJB.

  3. Нажмите кнопку назначения

  4. Всплывающая панель должна открыться с списком выбора, содержащим всех пользователей и назначенных пользователей

Проблема в том, что вызов 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="&gt;" removeText="&lt;">
                                  <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.

Другие вопросы по тегам