6 Stimmen

selectonemenu innerhalb einer Tabelle in jsf2

Ich habe eine Tabelle mit 2 selectOneMenu-Komponenten.

Ich möchte, dass, sobald ein Datensatz in der ersten selectOneMenu-Komponente ausgewählt wurde, das andere selectOneMenu mit Ajax in der gleichen Zeile aktualisiert wird.

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 habe ich:

List<SelectItem> myList,mySecondList;

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

Wie kann ich das mit Ajax machen? Ich verwende JSF2

6voto

BalusC Punkte 1034465

Verpacken Sie den Wert der Datentabelle in DataModel<E> so dass Sie die myInfo das betreffende Objekt durch DataModel#getRowData() . Also,

DataModel<MyInfo> myInfoModel; // +getter

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

con

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

y

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

Update wie in den Kommentaren, hier ist der Testfall, den ich erstellt habe, nachdem Sie gesagt haben, dass es nicht funktioniert. Es funktionierte bei mir mit Mojarra 2.0.3 sowohl auf Tomcat 7.0.5 als auch auf Glassfish 3.0.1.

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 beweist, dass jedes Mal, wenn Sie einen Dropdown-Wert in der ersten Spalte ändern, der Dropdown-Wert in der zweiten Spalte in derselben Zeile reflektiert wird, um denselben Wert abzurufen.

1voto

Khizar Punkte 2278

Ich hatte das gleiche Problem und nach vielen Versuchen und Irrtümern funktionierte dies für mich

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

}

Dies ist einfach und funktioniert perfekt für mich, wie die Nachricht, die ich in der ersten Spalte wählen aktualisiert die Optionen in der zweiten Spalte und seine durch Ajax getan. Aber dann wieder, ich m immer noch lernen und viel von meinem Wissen über jsf ist aus Material von @BalusC Blog :), so dass, wenn dieser Ansatz einige Fehler hat, bitte lemme wissen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X