2013-01-11 65 views
3

我使用p:tabView將可編輯數據拆分爲段。所有編輯元素都位於p:inplace組件的內部。該問題特別與p:selectOneMenu組件有關。p:selectOneMenu值設置爲null,當在p:刷新標籤頁視圖中inplace時

當整個選項卡視圖被刷新時,其他選項卡上的p:selectOneMenu的值被設置爲空。我不知道爲什麼。這是一個錯誤,還是這是一個錯誤的使用PrimeFaces組件?

環境:

  • PrimeFaces 3.4
  • MyFaces的2.0.7
  • 的IBM WebSphere 7.0

重現錯誤的方式:

  • 做一個TabView的有更多的一個標籤
  • 發生在一個標籤就地
  • 化妝按鈕將更新TabView的
  • 選擇selectOneMenu用於值,更改選項卡,單擊刷新並返回到標籤與selectOneMenu用於

的代碼裏面selectOneMenu用於

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
    <f:facet name="first"> 
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    </f:facet> 
    <title>QMWPSUI</title> 
    <h:outputScript library="qm" name="qmutils.js" /> 
    <h:outputScript library="qmwpsui" name="process.js" /> 
</h:head> 
<h:body> 


<h:form id="main"> 
    <p:blockUI block="main" trigger="refreshButton" widgetVar="block"> 
    <p:graphicImage 
      value="#{resource['primefaces-qmui:images/waitprogress.gif']}" /> 
    </p:blockUI> 

    <h3>Test</h3> 

     <p:commandButton id="refreshButton" widgetVar="refreshButton" 
       action="#{test.refresh}" 
       icon="ui-icon-refresh" title="#{i18n['action.reload']}" 
       onclick="block.show()" 
       update="tabView"/> 

     <p:tabView id="tabView" orientation="top" dynamic="TRUE"> 
     <p:tab id="tab1" title="Tab 1" process="@this"> 
      <h:outputLabel value="Type*:" for="type"/> 
      <p:inplace emptyLabel="Click here to change"> 
       <p:selectOneMenu id="typ" value="#{test.type}" effect="fade" 
        style="width:300px"> 
        <f:selectItem itemLabel="" itemValue="" /> 
        <f:selectItem itemLabel="Type a" itemValue="a" /> 
        <f:selectItem itemLabel="Type b" itemValue="b" /> 
        <f:selectItem itemLabel="Type c" itemValue="c" /> 
       </p:selectOneMenu> 
      </p:inplace> 
     </p:tab> 
     <p:tab id="tab2" title="Tab 2" process="@this"> 
     </p:tab> 
     <p:tab id="tab3" title="Tab 3" process="@this"> 
     </p:tab> 
     </p:tabView>  

</h:form> 

</h:body> 

bean類:

import java.io.Serializable; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean(name = "test") 
@ViewScoped 
public class TestBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private static final Logger log = LoggerFactory.getLogger(TestBean.class); 
    private String type; 

    public String getType() { 
     return type; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    @Override 
    public String toString() { 
     StringBuilder builder = new StringBuilder(); 
     builder.append("TestBean ["); 
     if (type != null) { 
     builder.append("type="); 
     builder.append(type); 
     } 
     builder.append("]"); 
     return builder.toString(); 
    } 

    public void refresh() { 
     log.info("Refresh"); 
     log.info("Test = <{}>", this); 
    } 

} 
樣本頁面和豆
+1

只是爲了讓情況更一般,似乎也發生在''的位置,並且沒有' '。 – Kevin

+0

可能與http://stackoverflow.com/questions/8237555/pselectonemenu-getting-null-on-submit-next有關? –

+0

有沒有其他的解決方案比不使用動態標籤? –

回答

-1

你需要一個轉換器,這種情況下

公共類EmptyToNullConverter實現轉換器{

@Override 
public Object getAsObject(FacesContext facesContext, UIComponent component, 
     String value) { 
    Object retorno = value; 
    if (value == null || value.isEmpty()) { 
     if (component instanceof EditableValueHolder) { 
      ((EditableValueHolder) component).setSubmittedValue(null); 
     } 
     retorno = null; 
    } 
    return retorno; 
} 

@Override 
public String getAsString(FacesContext facesContext, UIComponent component, 
     Object value) { 
    return (value == null) ? null : value.toString(); 
} 

}

,並在您定義faces-config.xml中

<converter> 
    <converter-for-class>java.lang.String</converter-for-class> 
    <converter-class>org.converter.EmptyToNullConverter</converter-class> 
</converter> 
+0

我不明白它如何解決這個問題 –

+0

這個轉換器解決了這裏描述的一個完全不同的問題:http://stackoverflow.com/questions/2203322/hinputtext-returna-a-empty-string-instead-of-null / – BalusC

相關問題