2013-03-29 2 views
2

Я использую JSF2.0. У меня есть три выпадающих списка:Как можно управлять зависимостями между выпадающими списками?

  1. masterDropDown.
  2. childDropDownA
  3. childDropDownB

Бизнес правило, которое должно быть приведено в исполнение является:

  1. Когда masterDropDown изменения, мне нужно заполнить childDropDownA и childDropDownB.
  2. Содержания childDropDownA и childDropDownB является же, за исключением, что когда пользователь выбирает что-то из childDropDownA, childDropDownB должен иметь свое старое содержимое, кроме одного, выбранного пользователя в childDropDownA. Это же правило применяется, когда пользователь сначала выбирает childDropDownB.

Каков самый чистый способ достичь этого в JSF?

ответ

4

Plain JSF 2:

<h:form> 
    <h:selectOneMenu id="ddlMaster" value="#{bean.ddlMasterSelected}"> 
     <f:listItems value="#{bean.ddlMasterData}" /> 
     <f:ajax listener="#{bean.fillChildren}" render="ddlChildA ddlChildB" /> 
    </h:selectOneMenu> 
    <h:selectOneMenu id="ddlChildA" value="#{bean.ddlChildASelected}"> 
     <f:listItems value="#{bean.ddlChildAData}" /> 
     <f:ajax listener="#{bean.refillChildB}" render="ddlChildB" /> 
    </h:selectOneMenu> 
    <h:selectOneMenu id="ddlChildB" value="#{bean.ddlChildBSelected}"> 
     <f:listItems value="#{bean.ddlChildBData}" /> 
     <f:ajax listener="#{bean.refillChildA}" render="ddlChildA" /> 
    </h:selectOneMenu> 
</h:form> 

Управляемый боб

@ManagedBean 
@ViewScoped 
public class Bean { 
    private Map<String, String> ddlMasterData; 
    private Map<String, String> ddlChildAData; 
    private Map<String, String> ddlChildBData; 
    private String ddlMasterSelected; 
    private String ddlChildASelected; 
    private String ddlChildBSelected; 

    @PostConstruct 
    public void init() { 
     //fill initial values for the drop down lists... 
     //this is a raw idea, you must refine it 
     DDLService ddlService = new DDLService(); 
     ddlMasterData = ddlService.getDDLMasterData(); 
     //empty data for children ddls 
     ddlChildAData = new LinkedHashMap<String, String>(); 
     ddlChildBData = new LinkedHashMap<String, String>(); 
    } 

    public void refillChildB(AjaxBehaviorEvent event) { 
     //filling the children ddls 
     DDLService ddlService = new DDLService(); 
     ddlChildASelected = ddlService.getDDLChildData(); 
     //same method to fill child data on ddlChildBSelected because is same data 
     ddlChildBSelected = ddlService.getDDLChildData(); 
    } 

    public void fillChildren(AjaxBehaviorEvent event) { 
     //when the user selects something from childDropDownA 
     //childDropDownB should have its old contents 
     //I assume it must be cleared, you can change this behavior though 
     ddlChildBData = new LinkedHashMap<String, String>(); 
    } 

    public void refillChildA(AjaxBehaviorEvent event) { 
     //The same rule applies when the user selects childDropDownB first 
     //I assume it must be cleared, you can change this behavior though 
     ddlChildAData = new LinkedHashMap<String, String>(); 
    } 
} 
+0

Что * делает * атрибут ' 'работает? – Inquisitive

+1

@Inquisitive он обновит содержимое компонента 'ddlChildA', вы должны указать идентификатор компонентов, которые хотите обновить, когда заканчивается вызов ajax. –

+0

@Inquisitive вы можете найти более подробную информацию о '' [здесь] (http://www.jsftoolbox.com/documentation/help/12-TagReference/core/f_ajax.html) –

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