2013-05-08 2 views
0

У меня есть эта модель:Показать конкретную модель свойства на основе выбранного элемента

public class Rent { 

    private Integer priceDay; 
    private Integer priceWeek; 
    private Integer priceMonth; 

    // ... 
} 

Я хотел бы показать цену желаемого срока в зависимости от типа цен, выбранного в раскрывающемся списке, который может быть «день «неделя» и «месяц». В настоящее время, я решил его следующим образом:

<h:selectOneMenu value="#{bean.priceType}"> 
    <f:selectItem itemValue="" itemLabel="Price" /> 
    <f:selectItem itemValue="day" /> 
    <f:selectItem itemValue="week" /> 
    <f:selectItem itemValue="month" /> 
    <f:ajax listener="#{bean.changePrice}" render="price" /> 
</h:selectOneMenu> 
<h:outputText id="price" value="#{bean.price}" /> 

с

public void changePrice(){ 
    if (priceType.compareTo("day") == 0) { 
     price = rent.getPriceDay(); 
    } else if (priceType.compareTo("week") == 0) { 
     price = rent.getPriceWeek(); 
    } else if (priceType.compareTo("month") == 0) { 
     price = rent.getPriceMonth(); 
    } 
} 

Однако, я чувствую, что это неуклюжее и должен быть проще и более удобным способом добиться того же, без необходимости для целого блока if-else и копий свойств модели в контроллере. Это возможно?

+0

EL работает на веб-сервере, а не в веб-браузере. Может быть, у вас был JavaScript? – BalusC

+0

Я думал что-то с JSF на самом деле, но ничего не дошло до сих пор =] –

+1

Как именно текущий подход «неэлегантный»? – BalusC

ответ

2

Вы можете использовать обозначение скобки [] в EL, чтобы ссылаться на свойства бина динамическим именем свойства.

Это должно сделать:

<h:selectOneMenu binding="#{priceType}"> 
    <f:selectItem itemValue="#{null}" itemLabel="Price" /> 
    <f:selectItem itemValue="priceDay" itemLabel="day" /> 
    <f:selectItem itemValue="priceWeek" itemLabel="week" /> 
    <f:selectItem itemValue="priceMonth" itemLabel="month" /> 
    <f:ajax render="price" /> 
</h:selectOneMenu> 
<h:panelGroup id="price"> 
    <h:outputText value="#{bean.rent[priceType.value]}" rendered="#{not empty priceType.value}" /> 
</h:panelGroup> 

Таким образом, вы можете избавиться от priceType и price свойств и changePrice() метода в вашем компоненте.


Несвязанные к конкретной проблеме, сравнивая строки (и объекты в целом) от стоимости не должно быть сделано с помощью compareTo() метода, но вместо того, чтобы equals().

Смежные вопросы