如何管理下拉菜单之间的依赖关系?

问题描述:

我正在使用JSF2.0。我有三个下拉菜单:如何管理下拉菜单之间的依赖关系?

  1. masterDropDown。
  2. childDropDownA
  3. childDropDownB

需要强制执行的业务规则是:

  1. 每当masterDropDown的变化,我需要填充childDropDownAchildDropDownB
  2. childDropDownAchildDropDownB的内容是相同除了使得当用户从childDropDownAchildDropDownB选择东西应具有除所述一个由用户在childDropDownA选择其旧的内容。当用户首先选择childDropDownB时,也适用相同的规则。

在JSF中实现这一点最简洁的方法是什么?

平原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调用完成时提供您想要更新的组件的id。 –

+0

@好奇你可以找到更多关于''的信息[这里](http://www.jsftoolbox.com/documentation/help/12-TagReference/core/f_ajax.html) –