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

标签 jsf jsf-2

我使用的是JSF2.0。我有三个下拉菜单:

  1. masterDropDown。
  2. childDropDownA
  3. childDropDownB

需要执行的业务规则是:

  1. 每当masterDropDown发生变化时,我都需要填充childDropDownAchildDropDownB
  2. childDropDownAchildDropDownB 的内容相同,除了当用户从 childDropDownA 中选择某些内容时,< em>childDropDownB 应该保留其旧内容,除了用户在 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>

托管bean

@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>();
    }
}

关于jsf - 如何管理下拉菜单之间的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15702650/

相关文章:

jsf - 如何在 JSF 页面中通过 EL 将数据放入 View 范围

css - JSF commandLink 与图像

jsf-2 - 为什么<h :panelGroup> id is not found when I access through <f:subview> tag?

jsf - 显示开/关 HTML 的不同区域

jsf - 'null Converter' 的转换错误设置值 - 为什么我在 JSF 中需要转换器?

jsf - Java EE 7,EL 3.0 规范。关于类型强制的变化

javascript - 单击按钮时滚动到对话框内的组件

JSF c :set evaluation

java - 如何重写calculateRenderKitId API

ajax - JSF 2.0 Ajax 问题