rich:popuppanel コンポーネントを使用していますが、ピックリストに値を入力する際に問題があります。
私の要件は以下の通りです。
拡張データ テーブルに入力する
チェックボックスを使用して行を選択 - その行のユーザー ID がバッキング Bean に渡されます
割り当てボタンをクリック
ポップアップ パネルが開き、すべてのユーザーと割り当てられたユーザーを含む選択リストが表示されます
問題は、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 はビュー スコープであるため、Bean が初期化されると、左側と右側の両方のパネルのデータが事前に入力されます。
@PostConstruct
public void init() {
setAllUsers(userService.getAllUsers());
setAssignedUsers(userService.getAllAssignedUsers(userBean.getSelectedIdforAssign()));
}
init() 自体にハードコードされた ID を指定して setAssignedUsers() を呼び出してみました。それは正常に動作します。必要なのは、ID を動的に渡し、getAssignedUsers() を呼び出す方法です。
これを実行する方法と、ポップアップが開いたときにピックリストを再レンダリングする方法を提案してください。
ありがとう!