http://www.primefaces.org/showcase/ui/pprSelect.jsfに似た sth を実現したいのですが、ダブルコンボのコレクションが必要なので、ui:repeatでラップしました
ダブルコンボのコレクションのどの要素が変更され、何をリロードする必要があるかをバックエンドで確認する必要があります。通信には例のようにp:ajaxが使用されますが、AjaxBehaviorEventは要素のインデックスのアイデアをもたらしません(つまり、ui:repeatによって生成されたダブルコンボ要素のインデックスを意味します)
私のクライアントコード、アイデアはajax イベントが発生するたびにbean:selectedIndexを更新することです ( selectOneMenuの値の変更時)、bean:selectedIndexの値は変更されたselectOneMenuのインデックスとして設定されます
private List<State> productStates
private int selectedIndex;
private List<Group> groups;
private Map<Integer, Collection<Device>> availableDevicesMap;
<ui:repeat var="state" value="#{bean.productStates}" varStatus="iter">
<p:selectOneMenu id="devGroup" value="#{state.group}">
<f:selectItems value="#{bean.groups}" />
<p:ajax update="refreshable" process="devGroup, @this" listener="#{bean.refreshDevicesForState}" >
<f:setPropertyActionListener target="#{bean.selectedIndex}" value="#{iter.index}"/>
</p:ajax>
</p:selectOneMenu>
<!-- THIS WILL BE UPDATED -->
<h:panelGroup id="refreshable">
<p:selectManyButton id="devices" value="#{state.devices}" >
<f:selectItems value="#{bean.availableDevicesMap[status.index]}" />
</p:selectManyButton>
</h:panelGroup>
</ui:repeat>
期待どおりに動作しないバックエンド。setPropertyActionListenerが呼び出されず、selectOneMenuコンポーネントが選択されたグループを値として取得していない
public refreshDevicesForState(AjaxBehaviorEvent e) {
SelectOneMenu menu = (SelectOneMenu)e.getComponent();
// this value is not as selected on frontend
Group group = (Group)menu.getValue();
// selectedIndex will not be set, so I assume that setPropertyActionListener didn't invoked
availableDevicesMap.put(selectedIndex, group.getDevices());
}
私は動作する以下のコードでも試しましたが、私の意見では醜いです
// id will be grandpaId:parentId:index:myId
String selectedIndex = IdHelper.getIdPart(e.getComponent().getClientId(), -2);
State state = productStates.get(Integer.parseInt(selectedIndex));
私はjsfリファレンス実装としてglassfishとMojarraで最新のprimefacesを使用しています
助けてくれてありがとう
より一般的な意味で:
バッキングされた Bean にオブジェクトのリストがあります。たとえば、車としましょう
List<Car> cars
frontent では、それらを反復処理して、すべての車の選択したブランドと選択したモデルの組み合わせを作成します。ユーザーが 4 台目の車のブランドを選択すると、4 台目の車が変更されることをバックエンドで知りたいので、この 1 台の車で利用可能なモデルのリストをリロードします
<ui:repeat var="state" value="#{bean.cars}" >
<p:selectOneMenu id="brands"/>// select brand
<p:selectOneMenu "models"/>// show available models depends on selected brand
</ui:repeat>
JSFの世界でそれを正しく処理するには?