我宁愿:
在呈现视图之前加载所需的所有内容:
<f:metadata>
<f:viewAction action="#{bean.onload}" />
</f:metadata>
public void onload(){
//Here load all the guys and all the cars and make the associations for the cars per guy.
//Use the java structures you consider, do not limit to what you have in your model
}
更改数据模型。当你为每个人选择汽车,同时为每个人保留选定的类型时,你需要两张地图:
Map<Guy, Type> type
和
Map<Guy, Car> cars
. 更多信息请参见末尾的链接。
桌子应该是这样的:
<p:dataTable value="#{bean.guys}" var="guy">
<p:column>
<p:selectOneMenu value="#{bean.type[guy]}">
<f:selectItem value="#{null}" noSelectionOption="true" />
<f:selectItems value="#{bean.allTypes}">
<!-- This reloads only the cars menu for this guy -->
<p:ajax event="change" listener="#{bean.typeChanged(guy)}" />
</p:selectOneMenu>
</p:column>
<p:column>
<!-- Use a map here, see https://stackoverflow.com/a/49653561/1199132 -->
<p:selectOneMenu value="#{bean.car[guy]}>
<f:selectItem value="#{null}" noSelectionOption="true" />
<!-- Loads the car selection for the type selected for the guy -->
<f:selectItems value="#{bean.availableCars(bean.type[guy])}" />
</p:selectOneMenu>
</p:column>
</p:dataTable>
您不需要在car选择中使用监听器,除非您希望立即将该值保存在db中,或者基于此刷新页面中的任何其他部分。只需实现一个save按钮并使其逻辑保存所有
Map<Guy, Car>
被击中时的值。
你也需要适当的
Type
和
Car
转换器。
参见: