Как обновить несколько компонентов (selectOneMenu) с зависимыми отношениями объектов?

у меня есть следующее (не требующее пояснений) отношение сущности:

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

Мой бин

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 должны быть обновлены в зависимости от выбора в первом
  • Последний p:selectOneMenu с идентификатором tireSel не обновляется правильно
  • Все подлежащие обновлению компоненты находятся внутри одного и того же NamingContainer
  • carSel обновляется, но значения, загруженные в tireSel, странные (кажутся действительными для последнего запроса)
  • я также пробовал update="@form" в manufacturerSel

EDIT Чтобы показать, какая версия 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>

person jimmybondy    schedule 02.11.2012    source источник


Ответы (2)


В основном вам нужно очистить значение 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.
}

В противном случае старое выбранное значение все еще сохранится в бине, и список шин по-прежнему будет зависеть от него.

person BalusC    schedule 02.11.2012
comment
Привет, BalusC, хотя с помощью EL 2.2 я получил javax.el.ELException: Failed to parse the expression [#{myBean.setSelectedCar(null)}] - person jimmybondy; 02.11.2012
comment
Какой сервлетконтейнер вы используете? Тем временем просто создайте метод слушателя обычным способом, который очищает значение свойства selectedCar. - person BalusC; 02.11.2012
comment
Я попытаюсь добавить bean-метод и идентификатор вызова с <p:ajax listener="#{myBean.resetSelectedCar}" ..> - person jimmybondy; 02.11.2012
comment
:-) Хорошая же мысль. Использование Томкэт 6. - person jimmybondy; 02.11.2012
comment
Tomcat 6 не поставляется с EL 2.2 из коробки. Какую альтернативную реализацию EL вы используете? - person BalusC; 02.11.2012
comment
добавил отрывок из моего pom.xml в пост - person jimmybondy; 02.11.2012

Обычно обновление командной кнопки PrimeFaces работает для всей формы. Но иногда мы не хотим обновлять всю форму, может быть, мы хотим обновить div с одним идентификатором или несколько div с одним и тем же классом. Он работает с Primefaces и Spring Boot.

Если вы хотите обновить всю форму, просто измените атрибут обновления:

update="@form"

Если вы хотите обновить div внутри идентификатора

update="@(#divId)"

Если вы хотите обновить несколько div или один div, используя имя класса-

update="@(.className)"

Если вы хотите обновить несколько div или один div, используя имя класса-

update="@(.className1, .className2)"
person Nazmul Hossain    schedule 30.05.2021