2

JSF2.0を使用しています。3 つのドロップダウンがあります。

  1. masterDropDown.
  2. childDropDownA
  3. childDropDownB

強制する必要があるビジネス ルールは次のとおりです。

  1. masterDropDownが変更されるたびに、 childDropDownA と childDropDownB を設定する必要あります。
  2. childDropDownAchildDropDownBのコンテンツは同じですが、ユーザーがchildDropDownAから何かを選択した場合、childDropDownBは、ユーザーがchildDropDownAで選択したものを除いて古いコンテンツを持つ必要があります。ユーザーが最初にchildDropDownBを選択した場合も、同じ規則が適用されます。

JSFでこれを達成する最もクリーンな方法は何ですか?

4

1 に答える 1

4

プレーン 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>();
    }
}
于 2013-03-29T12:22:10.573 に答える