0

リスト (stationaryList) を再作成するにはどうすればよいですか? 私のコードで何が問題になっていますか? 値 = CDL または MEL または NEF を選択しても、リストは何も変わりません。ありがとう。

<h:form id="frmCreateNewStationary">
<ui:param name="s" value="#{myController.selected}"/>
<h:panelGrid columns="2">
    <h:outputLabel value="Type" for="idType" />
    <h:selectOneMenu id="idType" value="#{s.stationaryid.type}">
        <f:selectItem itemLabel="Select ..." noSelectionOption="true" />
        <f:selectItem itemLabel="CDL" itemValue="CDL" />
        <f:selectItem itemLabel="MEL" itemValue="MEL" />
        <f:selectItem itemLabel="NEF" itemValue="NEF" />
        <f:ajax event="change" listener="#{myController.changeStationaryCodeList}" render="idCode" execute="@this" />
    </h:selectOneMenu>
    <h:outputLabel value="Code" for="idCode" />
    <h:selectOneMenu id="idCode" value="#{s.stationaryid.code}">
        <f:selectItem itemLabel="Select ..." noSelectionOption="true" />
        <f:selectItems value="#{myController.stationaryList}" />
    </h:selectOneMenu>
</h:panelGrid>
</h:form>

ジャワ

private List<Stationary> stationaryList = null;
public List<Stationary> getStationaryList() {
    stationaryList = getCode();
    return stationaryList;
}

public void setStationaryList(List<Stationary> stationaryList) {
    this.stationaryList = stationaryList;
}

...

public List<Stationary> getCode() {
    //"Stationary.ccc", query = "SELECT s.code FROM Stationary s"),
    EntityManager emf = facade.getEntityManager();
    Query query = emf.createNamedQuery("Stationary.ccc");
    return query.getResultList();        
}

...

public List<Stationary> getStationaryCodeItems(String type) {
    //"Stationary.code", query = "SELECT s.code FROM Stationary s WHERE s.type = :type"),
    EntityManager emf = facade.getEntityManager();
    Query query = emf.createNamedQuery("Stationary.code");
    query.setParameter("type", type);
    return query.getResultList();
}

AjaxBehaviorEvent は次のようになります。

public void changeStationaryCodeList(AjaxBehaviorEvent ev) {
    stationaryList.clear();
    String type = (String) ((UIInput) ev.getComponent()).getValue();
    System.out.println("Test__changeStationaryCodeList -- state == " + type);
    stationaryList = getStationaryCodeItems(type);
    //setStationaryList(stationaryList);
}
4

1 に答える 1

0

属性が設定されていませ<h:selectOneMenu id="idType">ん。valueすでに行っているように、それをバッキングBeanの値にバインドすると<h:selectOneMenu id="idCode" value="#{s.stationaryid.code}">、ajaxリスナーでその属性を送信された値として使用できます。また、ここでは適切なスコープを使用していない可能性があると感じています。バッキングBeanに@ViewScopedアノテーションを付けて、ajax-ingでヒッチフリーの結果を実現します。

これとは関係なく、なぜ「s」という名前のバッキングBeanがあるのですか?それはあなたのコードを読むのを苦痛にするだけです。

于 2012-11-10T05:25:43.753 に答える