如何更新多个组件(selectOneMenu),并具有依赖对象关系?

7
我有一个以下(不言自明)的实体关系:

我有以下(不言自明)的实体关系:

* Manufacturer
* Car    (Manufacturer.getCars())
* Tire   (Car.getTires())

MyBean

private List<Manufacturer> allManufacturers

private Manufacturer selectedManufacturer
private Car selectedCar
private Tire selectedTire

xhtml

<p:selectOneMenu id="manufacturerSel" value="#{myBean.selectedManufacturer}" converter="#{manufacturerConverter}">
    <f:selectItem itemLabel="None" itemValue="#{null}" />
    <f:selectItems value="#{myBean.allManufacturers}" />
    <p:ajax update="carSel tireSel" />
</p:selectOneMenu>

<p:selectOneMenu id="carSel" value="#{myBean.selectedCar}" converter="#{carsConverter}" disabled="#{empty myBean.selectedManufacturer.cars}">
    <f:selectItem itemLabel="None" itemValue="#{null}" />
    <f:selectItems value="#{myBean.selectedManufacturer.cars}"  />
    <p:ajax update="tireSel" />
</p:selectOneMenu>

<p:selectOneMenu id="tireSel" value="#{myBean.selectedTire}" converter="#{tiresConverter}" disabled="#{empty myBean.selectedCar.tires}">
    <f:selectItem itemLabel="None" itemValue="#{null}" />                            
    <f:selectItems value="#{myBean.selectedCars.tires}"  />
</p:selectOneMenu>
  • 根据第一个选择框的选项更新最后两个p:selectOneMenu
  • ID为tireSel的最后一个p:selectOneMenu没有正确更新
  • 所有需要更新的组件都在同一个NamingContainer
  • carSel被更新了,但是载入到tireSel中的值很奇怪(似乎对于上次请求是有效的)
  • 我也尝试在manufacturerSel中使用update="@form"

编辑 展示所使用的EL版本: 这里是我的pom.xml的一部分

<dependency>
    <groupId>javax.faces</groupId>
    <artifactId>javax.faces-api</artifactId>
    <version>2.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.faces</artifactId>
    <version>2.1.12</version>
</dependency>    
<dependency>
    <groupId>javax.el</groupId>
    <artifactId>el-api</artifactId>
    <version>2.2</version>
    <scope>provided</scope>
</dependency>
2个回答

10

你基本上需要清除 selectedCar 的值。你可以使用 <p:ajax listener> 来实现。

<p:ajax listener="#{myBean.clearSelectedCar}" update="carSel tireSel" />

随着

public void clearSelectedCar() {
    selectedCar = null; // You might want to clear selectedTire as well.
}
否则,旧的选定值仍将保留在bean中,并且轮胎列表仍将取决于它。

嗨,BalusC,尽管我使用EL 2.2,但我得到了javax.el.ELException:无法解析表达式[#{myBean.setSelectedCar(null)}]的错误。 - jimmybondy
你使用的是哪个servlet容器?同时,按照通常的方式创建一个监听器方法,清除selectedCar属性值。 - BalusC
我将尝试添加一个bean方法,并使用<p:ajax listener="#{myBean.resetSelectedCar}" ..>调用id。 - jimmybondy
:-) 很棒,想法一致。使用 Tomcat 6。 - jimmybondy
Tomcat 6默认不包含EL 2.2。你使用的是哪个替代的EL实现? - BalusC
将我的 pom.xml 的摘录添加到帖子中。 - jimmybondy

2

通常情况下,PrimeFaces 命令按钮的更新是针对整个表单进行的。但有时我们不想更新整个表单,可能只想更新一个具有特定 id 的 div 或多个具有同一类的 div。这适用于 PrimeFaces 和 Spring Boot。

如果您想更新整个表单,请更改 update 属性:

update="@form"

如果你想更新一个ID内的div。
update="@(#divId)"

如果您想使用类名更新多个div或单个div-
update="@(.className)"

如果您想使用类名更新多个div或单个div-
update="@(.className1, .className2)"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接