Как установить значение для SelectOneMenu только при загрузке? - PullRequest
0 голосов
/ 11 июня 2018

Используя JSF, я пытаюсь создать некую сложную ситуацию (имена классов были реорганизованы, а пример минималистичен):

  • DB отношение: a guy имеет a car, a car имеет a type, a type имеет cars

selectOneMenu для CarType необходимо выполнять 2 роли:

  • показатьтип автомобиля в загрузка
  • изменить предложения автомобилей при его изменении

Когда я загружаю свои dataTable для каждого ряда,Я хочу показать стоимость автомобиля, если у парня есть такой (null - правильный выбор), и в selectOneMenu для CarType, если хотите показать тип машины парня, если у парня естьодин, но я не могу использовать guy.car.carType, потому что я не хочу перезаписывать при изменении его значения, это меню также должно служить меню research : я выбираюa Тип, я вижу его машины

Я не могу понять, какую привязку использовать для установки его значения в начале


1.Классы

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

2.Вид

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

3.Боб

class Bean{
    public List<Guy> guys;        // filled from DB
    public List<Car> cars;        // filled from DB
    public List<CarType> types;   // filled from DB
    private Car selectedCar;      // getter setter ok
    private CarType selectedType; // getter setter ok

    public List<Car> cars(Guy g){
        selectedCar = g.getCar();
        cars = selectedCar.getCarType().getCars(); // all cars of this type
    }

    public void changeType(){
        cars = selectedType.getCars();
    }

    public void changeCar(Guy g){
        g.setCar(selectedCar);
    }
}

1 Ответ

0 голосов
/ 12 июня 2018

Я бы предпочел:

Загрузить все, что вам нужно, прежде чем представление будет обработано:

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

Вам не нужен слушатель при выборе автомобиля, если вы не хотите немедленно сохранить его.это значение в БД или обновите любые другие части на странице на основе этого.Просто реализуйте кнопку сохранения и заставьте ее логику сохранять все значения Map<Guy, Car> при попадании.

Вам также потребуются правильные преобразователи Type и Car.

См.также:

...