簡體   English   中英

Primefaces“ selectOneMenu”中的ajax問題

[英]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個選擇:

  1. 使它成為@ManagedBean @RequestScoped而不是@FacesConverter並將其引用為converter="#{areaConverter}"而不是converter="areaConverter"

  2. 安裝> = 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。

Omnifaces選擇項目轉換器

您正在嘗試使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM