如何在加载时为SelectOneMenu设置值?

时间:2018-06-11 13:21:05

标签: jsf primefaces selectonemenu

使用JSF,我试图做出一种复杂的情况(类名已被重构,示例极简):

  • DB关系:a guya cara cara typea typecars

selectOneMenu CarType需要运营2个角色:

  • loading
  • 中显示汽车的类型
  • 改变汽车命题

当我加载dataTable时,对于每一行,我想显示汽车的价值,如果这个人有一个(null是一个有效的选择),并且在{{1} } selectOneMenu如果想要显示该人的汽车类型,如果该人有一个,但我不能使用CarType,因为我不想写过当更改其值时,此菜单还需要作为 research 菜单:我选择一个Type,我可以看到它的汽车

我无法确定在开始时使用哪个绑定来设置其值

1。类

guy.car.carType

2。图

class Guy{
    Car car;
}
class Car{
    CarType type;
}
class CarType{
    String type;
}

第3。豆

<p:dataTable value="#{Bean.guys}"  var="guy">
    <p:column>
        <p:selectOneMenu value="#{Bean.selectedType}>
            <f:selectItem value="#{null}" />
            <f:selectItems value="#{Beans.types}">
            <p:ajax event="change" listener="#{bean.changeType}" />
        </p:selectOneMenu>
    </p:column>

    <p:column>
        <p:selectOneMenu value="#{Bean.selectedCar}>
            <f:selectItem value="#{null}" />
            <f:selectItems value="#{Beans.cars(guy)}" />
            <p:ajax event="change" listener="#{bean.changeCar(guy)}" />
        </p:selectOneMenu>
    </p:column>

</p:dataTable>

1 个答案:

答案 0 :(得分:1)

我宁愿:

在渲染视图之前加载您需要的所有内容:

<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> typeMap<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>

您不需要在汽车选择中使用监听器,除非您希望立即在DB中保留该值或基于此刷新页面中的任何其他部分。只需实现一个保存按钮,并使其逻辑在被击中时保存所有Map<Guy, Car>值。

您还需要正确的TypeCar转换器。

另见: