selectOneMenu用于内部表中JSF2 [英] selectonemenu inside table in jsf2
问题描述
我有一个表2 selectOneMenu用于组件。
I have a table with 2 selectOneMenu components.
我想,一旦一个记录被选为第一selectOneMenu用于组件将更新其他selectOneMenu用于与阿贾克斯同排。
I would like that once a record was chosen in the first selectOneMenu component it will update the other selectOneMenu with Ajax in the same row.
我的表:
<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>
在豆我有:
List<SelectItem> myList,mySecondList;
public void refershNames(AjaxBehaviorEvent event){
//how can I retrieve the selected item and update the relevant record?
}
我如何能做到这一点用Ajax?我使用JSF2
How can I do it with Ajax? I am using JSF2
推荐答案
裹的数据表值的 的DataModel&LT; E&GT;
这样就可以得到 MyInfo的
通过 <$ C有问题的对象$ C>的DataModel#getRowData() 。因此,
Wrap the datatable value in DataModel<E>
so that you can obtain the myInfo
object in question by DataModel#getRowData()
. So,
DataModel<MyInfo> myInfoModel; // +getter
@PostConstruct
public void init() {
myInfo = myInfoDAO.list();
myInfoModel = new ListDataModel<MyInfo>(myInfo);
}
与
<h:dataTable value="#{myBean.myInfoModel}" var="myInfo">
和
public void refreshNames(AjaxBehaviorEvent event){
MyInfo myInfo = myInfoModel.getRowData();
// Get code and update secondCode.
}
更新作为每个注释,这里是我创建后告知,没有工作的测试用例。它的工作对我来说与Mojarra 2.0.3两个Tomcat的7.0.5和Glassfish 3.0.1。
Update as per the comments, here is the testcase I created after you told that it didn't work. It worked for me with Mojarra 2.0.3 on both Tomcat 7.0.5 and 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>
此测试用例证明无论何时在第一列改变下拉值,然后在相同的行中的第二列中的下拉值将被反射以检索相同的值。
This testcase proves that whenever you change a dropdown value in the 1st column, then the dropdown value in the 2nd column in the same row will be reflected to retrieve the same value.
这篇关于selectOneMenu用于内部表中JSF2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!