selectonemenu innen in Tabelle jsf2

stimmen
6

Ich habe eine Tabelle mit 2 selectOneMenu Komponenten.

Ich mag, dass, sobald ein Datensatz in der ersten selectOneMenu Komponente wurde gewählt, es wird die andere selectOneMenu mit Ajax in der gleichen Zeile aktualisieren.

Mein Tisch:

<p:dataTable value=#{myBean.myInfo} var=myInfo>
    <p:column>
        <f:facet name=header>Group</f:facet>
        <h:selectOneMenu value=#{myInfo.myInfoType.code}>
            <f:selectItems value=#{myBean.myList} />
            <f:ajax event=change execute=@this listener=#{myBean.refershNames} render=myNames/>
        </h:selectOneMenu>
    </p:column>
    <p:column>
        <f:facet name=header>Name</f:facet>
        <h:selectOneMenu id=myNames value=#{myInfo.myInfoType.secondCode}>
            <f:selectItems value=#{myBean.mySecondList} />
        </h:selectOneMenu>
    </p:column>
<p:dataTable>

In der Bohne ich habe:

List<SelectItem> myList,mySecondList;

public void refershNames(AjaxBehaviorEvent event){
    //how can I retrieve the selected item and update the relevant record?
}

Wie kann ich es mit Ajax? Ich verwende JSF2

Veröffentlicht am 24/02/2011 um 17:51
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
6

Wickeln Sie die Datentabelle Wert in DataModel<E>so dass Sie das erhalten myInfoObjekt in Frage DataModel#getRowData(). Damit,

DataModel<MyInfo> myInfoModel; // +getter

@PostConstruct
public void init() {
    myInfo = myInfoDAO.list();
    myInfoModel = new ListDataModel<MyInfo>(myInfo);
}

mit

<h:dataTable value="#{myBean.myInfoModel}" var="myInfo">

und

public void refreshNames(AjaxBehaviorEvent event){
    MyInfo myInfo = myInfoModel.getRowData();
    // Get code and update secondCode.
}

Update gemäß den Kommentaren, hier ist der Testfall I erstellt , nachdem Sie gesagt , dass es nicht funktioniert hat . Er arbeitete für mich mit Mojarra 2.0.3 sowohl auf Tomcat 7.0.5 und 3.0.1 Glassfish.

com.example.Item

public class Item {

    private String value1;
    private String value2;

    // Generate public getters/setters.    
}

com.example.Bean

@ManagedBean
@ViewScoped
public class Bean {

    private List<Item> items;
    private DataModel<Item> model;
    private List<String> list;

    @PostConstruct
    public void init() {
        items = Arrays.asList(new Item(), new Item(), new Item());
        model = new ListDataModel<Item>(items);
        list = Arrays.asList("one", "two", "three");
    }

    public void change(AjaxBehaviorEvent e) {
        Item item = model.getRowData();
        item.setValue2(item.getValue1());
    }

    public DataModel<Item> getModel() {
        return model;
    }

    public List<String> getList() {
        return list;
    }

}

test.xhtml

<h:form>
    <h:dataTable value="#{bean.model}" var="item">
        <h:column>
            <h:selectOneMenu value="#{item.value1}">
                <f:selectItem itemLabel="select..." itemValue="#{null}" />
                <f:selectItems value="#{bean.list}" />
                <f:ajax execute="@this" listener="#{bean.change}" render="list2" />
            </h:selectOneMenu>
        </h:column>
        <h:column>
            <h:selectOneMenu id="list2" value="#{item.value2}">
                <f:selectItem itemLabel="select..." itemValue="#{null}" />
                <f:selectItems value="#{bean.list}" />
            </h:selectOneMenu>
        </h:column>
    </h:dataTable>
</h:form>

Dieser Testfall zeigt, dass, wenn Sie einen Drop-Down-Wert in der ersten Spalte zu ändern, dann wird der Drop-Down-Wert in der zweiten Spalte in der gleichen Zeile den gleichen Wert abzurufen widerspiegelt.

Beantwortet am 24/02/2011 um 18:00
quelle vom benutzer

stimmen
1

Ich hatte das gleiche Problem und nach viel Versuch und Irrtum dies für mich gearbeitet

<p:column style="width:50%">
                    <f:facet name="header">
                        <h:outputText value="Criteria" />
                    </f:facet>
                    <h:selectOneMenu value="#{option.predefinedMessageId}"
                        valueChangeListener="#{predefinedMessageBean.predefinedMessageChangeListener}">
                        <f:selectItems
                            value="#{campaignRecipientCriteriaBean.messages}"
                            var="predef" itemLabel="#{predef.fieldName}"
                            itemValue="#{predef.predefinedMessageId}" />
                            <p:ajax event="change" update="optionsList"/>

                    </h:selectOneMenu>
                </p:column>


                <p:column>
                    <f:facet name="header">
                        <h:outputText value="Options" />
                    </f:facet>
                    <p:outputPanel id="optionsList">
                    <h:selectOneMenu
                        value="#{option.predefinedMessageOptionId}">
                        <f:selectItems
                            value="#{predefinedMessageBean.emptyOptionBeansList}"
                            var="predef" itemLabel="#{predef.optionCaption}"
                            itemValue="#{predef.predefinedMessageOptionId}" />

                    </h:selectOneMenu>
                    </p:outputPanel>
                </p:column>

valuechangelistener ist

public void predefinedMessageChangeListener(ValueChangeEvent e)
{

        getPredefinedMessageOptions(Integer.parseInt(e.getNewValue().toString()));


}

Das ist einfach und funktioniert perfekt für mich, wie die Nachricht, die ich wählen, in der ersten Spalte die Optionen in der zweiten Spalte aktualisiert und seine durch Ajax getan. Aber dann wieder, im noch zu lernen und eine Menge meines Wissens von JSF ist aus Material aus @BalusC Blog :), also wenn dieser Ansatz einige Mängel hat, bitte lass dich wissen.

Beantwortet am 29/04/2011 um 15:44
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more