selectsmenu在jsf2中的表中

Dej*_*ell 6 java ajax jsf primefaces jsf-2

我有一个包含2个selectOneMenu组件的表.

我希望一旦在第一个selectOneMenu组件中选择了一条记录,它将在同一行中使用Ajax更新另一个selectOneMenu.

我的桌子:

<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>
Run Code Online (Sandbox Code Playgroud)

在我有的豆:

List<SelectItem> myList,mySecondList;

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

我怎么能用Ajax做到这一点?我正在使用JSF2

Bal*_*usC 6

包装数据表值,DataModel<E>以便您可以获取有myInfo问题的对象DataModel#getRowData().所以,

DataModel<MyInfo> myInfoModel; // +getter

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

<h:dataTable value="#{myBean.myInfoModel}" var="myInfo">
Run Code Online (Sandbox Code Playgroud)

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

根据评论更新,这是我告诉它不起作用后创建的测试用例.它在Tomcat 7.0.5和Glassfish 3.0.1上都使用Mojarra 2.0.3.

com.example.Item

public class Item {

    private String value1;
    private String value2;

    // Generate public getters/setters.    
}
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

此测试用例证明,无论何时更改第1列中的下拉列值,都会反映同一行中第2列中的下拉值以检索相同的值.

  • 请参阅答案更新.请注意,我现在意识到您正在使用PrimeFaces.您可能需要使用`<p:ajax>`.另请注意,对于不是标准类型(String,Number,Boolean)的情况,项值必须正确实现`equals()`. (2认同)