[英]issue with ajax in primefaces “selectOneMenu”
index.xhtml
<p:selectOneMenu id="d2" value="#{mainManageBean.areaSelected}" >
<f:selectItem itemValue="" itemLabel="Select one" />
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area.id}" itemLabel="#{area.name}"/>
<p:ajax event="valueChange" listener="#{mainManageBean.changeAreaSelect()}" update="hi" />
</p:selectOneMenu>
當我設置了像這樣的“ mainManageBean.areaSelected”值時,其中areaSelected是數據庫中的實體
private Area areaSelected;
ajax事件不起作用,但是當我將其更改為“ mainManageBean.s1menu”這樣的名稱時,其中“ s1menu”只是普通的String ajax事件可以正常工作。
這是什么原因以及如何解決?
這是我的臭蟲轉換器:
@FacesConverter
public class areaConverter implements Converter{
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
// here i have problem value is id of entity and have no idea how to get this entity form this id
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
// works fine value = Area entity
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null || value.equals("")) {
return "";
} else {
return String.valueOf(((Area) value).getId());
}
}
}
getAsObject有問題,我將此值作為id但無法從中獲取實體。 通常我會使用AreaFacade.find(id),但是我不能使用@EJB來獲取它。
首先,您的<f:selectItem itemValue>
是錯誤的。 它應該表示與<p:selectOneMenu value>
完全相同的類型,因此它是Area
。 將itemValue="#{area.id}"
替換為itemValue="#{area}"
。 為此,您確實需要一個Converter
。
至於您的轉換器問題,
getAsObject有問題,我將此值作為id但無法從中獲取實體。 通常我會使用AreaFacade.find(id),但是我不能使用@EJB來獲取它。
您有2個選擇:
使它成為@ManagedBean @RequestScoped
而不是@FacesConverter
並將其引用為converter="#{areaConverter}"
而不是converter="areaConverter"
。
安裝> = 1.6的OmniFaces 。 它在@FacesConverter
為@EJB
添加了完全透明的支持,而沒有任何其他配置或注釋。
如果仍然使用OmniFaces路徑,那么您也可以完全放棄自定義轉換器,並使用其內置的SelectItems(Index)Converter
而無需為itemValue="#{area}"
創建任何自定義轉換器。
<p:selectOneMenu ... converter="omnifaces.SelectItemsConverter">
根據庫巴的評論
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area.id}" itemLabel="#{area.name}"/>
將itemValue更改為
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area}" itemLabel="#{area.name}"/>
更新:
另一件事可能是轉換器。 我的建議是使用Onmnifaces的SelectItemsConverter。
您正在嘗試使用ID值設置一個Entity,我認為是Integer還是String? Ajax不觸發的原因是因為沒有發生event="valueChange"
。 如果您嘗試不使用Ajax提交此表單,則會收到一個不錯的ClassCastException。 正如我在評論中提到的以及Makky在他的回答中所述,將itemValue更改為:
<p:selectOneMenu id="d2" value="#{mainManageBean.areaSelected}" >
<f:selectItem itemValue="#{null}" itemLabel="Select one" />
<f:selectItems value="#{mainManageBean.areaList}" var="area"
itemValue="#{area}" itemLabel="#{area.name}"/>
<p:ajax listener="#{mainManageBean.changeAreaSelect()}" update="hi" process="@this />
</p:selectOneMenu>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.