2014-04-25 128 views
0

我有一個Primefaces dialog,裏面有一個tabView。在這個tabView中,我有3個選項卡,每個選項都被稱爲ui:include。在第一個標籤中,我有一個selectOneMenu,它定義了ProprietarioORM類中名爲tipoProprietario的屬性。選項卡之間的導航不是通過標籤本身完成的(在這個階段它們被禁用),而是通過對話框底部的命令按鈕完成。當我點擊一個命令按鈕從第一個標籤tipoProprietario正確填充。但是,當我點擊從第二個第三個選項卡(或甚至第一個)傳遞時,我發現selectItem值更改爲null。因此,tipoProprietario屬性也更改爲null。在調試中,我看到它首先被稱爲Select Item偵聽器方法,並在tipoProprietario之後。p:selectOneMenu在選項卡變更時更改

有人可以解釋爲什麼會發生這種情況嗎?如何糾正?

dialog.xhtml

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
    <p:dialog id="dlgEdicao" widgetVar="dlgEdicao" resizable="false" 
     closable="true" modal="true" closeOnEscape="true" 
     header="#{(proprietarioMB.edicao)? msg['proprietario.titulo.editar']: msg['proprietario.titulo.incluir']}"> 
     <p:tabView id="tabEdicao" widgetVar="tabEdicao" dynamic="true" 
      styleClass="tabEdicaoProprietario" cache="false" 
      binding="#{proprietarioMB.tabEdicao}"> 
      <p:tab id="tabProprietario" title="#{msg['proprietario.titulo']}" 
       disabled="#{not proprietarioMB.edicao}" titleStyleClass=""> 
       <ui:include src="./aba_proprietario.xhtml" /> 
      </p:tab> 
      <p:tab id="tabEnderecoContato" 
       title="#{msg['proprietario.titulo.aba.endereco']}" 
       disabled="#{not proprietarioMB.edicao}"> 
       <ui:include src="./aba_endereco_contato.xhtml" /> 
      </p:tab> 
      <p:tab id="tabVeiculo" 
       title="#{msg['proprietario.titulo.aba.veiculo']}" 
       disabled="#{not proprietarioMB.edicao}"> 
       <ui:include src="./aba_veiculo.xhtml" /> 
      </p:tab> 
     </p:tabView> 

     <f:facet name="footer"> 
      <p:commandButton id="btnDialogoAnterior" 
       value="#{msg['titulo.anterior']}" 
       rendered="#{not proprietarioMB.edicao}" immediate="true" 
       disabled="#{not proprietarioMB.btnAnteriorHabilitado}" 
       actionListener="#{proprietarioMB.doEventClickBtnAnterior}" 
       update="@this tabEdicao btnDialogoSeguinte btnDialogoConcluir" 
       style="margin-right: 20px;" /> 

      <p:commandButton id="btnDialogoSeguinte" 
       value="#{msg['titulo.proximo']} #{(not proprietarioMB.btnConcluirVisivel)? '': 'display: none;'}" 
       rendered="#{not proprietarioMB.edicao}" 
       actionListener="#{proprietarioMB.doEventClickBtnSeguinte}" 
       update="@this tabEdicao btnDialogoAnterior btnDialogoConcluir" 
       style="margin-right: 20px; #{(not proprietarioMB.btnConcluirVisivel)? '': 'display: none;'}" /> 

     </f:facet> 

    </p:dialog> 
</ui:composition> 

aba_proprietario.xhtml(第一標籤)

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui"> 
    <p:panel id="pnlDadosProprietario"> 
     <p:focus for="selTipoEdicao" /> 
     <p:fieldset id="fieldDadosProprietario" 
      legend="#{msg['proprietario.titulo']}" 
      rendered="#{not empty proprietarioMB.proprietario}"> 
      <p:panelGrid id="pnlDadosProprietarioEdicao"> 
       <p:row> 
        <p:column> 
         <p:outputLabel id="lblTipoEdicao" 
          value="#{msg['proprietario.titulo.tipo']}" for="selTipoEdicao" /> 
        </p:column> 
        <p:column> 
         <p:selectOneMenu id="selTipoEdicao" 
          value="#{proprietarioMB.proprietario.tipoProprietario}" 
          valueChangeListener="#{proprietarioMB.doEventTipoDocumentoPesquisaChanged}" 
          immediate="true"> 
          <f:selectItems value="#{proprietarioMB.tiposProprietarios}" /> 
          <p:ajax event="change" update="txtDocumentoEdicao" /> 
         </p:selectOneMenu> 
        </p:column> 
        <p:column> 
         <p:outputLabel id="lblDocumentoEdicao" 
          value="#{msg['proprietario.titulo.documento']}" 
          for="txtDocumentoEdicao" /> 
        </p:column> 
        <p:column> 
         <p:inputMask id="txtDocumentoEdicao" 
          value="#{proprietarioMB.proprietario.documento}" 
          mask="#{proprietarioMB.mascaraDocumento}" /> 
        </p:column> 
       </p:row> 
      </p:panelGrid> 
     </p:fieldset> 
    </p:panel> 
</ui:composition> 

託管bean

@ManagedBean 
@ViewScoped 
public class ProprietarioMB { 


    private static final String MASCARA_CPF = "999.999.999-99"; 

    private static final String MASCARA_CNPJ = "99.999.999/9999-99"; 

    private static final SelectItem[] tiposProprietarios = new SelectItem[] { 
      new SelectItem(JURIDICA, JURIDICA.getDescricao()), 
      new SelectItem(FISICA, FISICA.getDescricao()), }; 

    private ProprietarioORM proprietario; 

    private String mascaraDocumento; 

    private TabView tabEdicao; 

    /** 
    * Select Item listener method: Changes inputMask mask 
    */ 
    public void doEventTipoDocumentoPesquisaChanged(ValueChangeEvent event) { 
      this.mascaraDocumento = (event.getNewValue() == FISICA) ? MASCARA_CPF 
        : MASCARA_CNPJ; 
    } 

    public void doEventClickBtnAnterior() { 
     System.out.println("ProprietarioMB.doEventClickBtnAnterior(): " 
       + this.tabEdicao.getActiveIndex()); 
      this.tabEdicao.setActiveIndex(this.tabEdicao.getActiveIndex() - 1); 
    } 

    public void doEventClickBtnSeguinte() { 
     System.out.println("ProprietarioMB.doEventClickBtnSeguinte(): " 
       + this.tabEdicao.getActiveIndex()); 
     System.out.println("ProprietarioMB.doEventClickBtnSeguinte(): " 
       + this.proprietario); 
     if (this.tabEdicao.getActiveIndex() == 0) { 
      if (this.validarProprietario()) { // Validation method 
       this.tabEdicao.setActiveIndex(1); 
      } 
     } else if (this.tabEdicao.getActiveIndex() == 1) { 
      this.tabEdicao.setActiveIndex(2); 
     } 
    } 

    // Other methods + getters & setters 

} 

ProprietarioORM

public class ProprietarioORM { 

    private String nome; 

    private TipoProprietarioEnum tipoProprietario; 

    // getters & setters 

} 

回答

0

這很可能是因爲binding="#{proprietarioMB.tabEdicao}"

首先,你看起來並不需要綁定。即使您這樣做了,您也無法初始化支持bean中的組件,這會導致<p:tabView/>試圖綁定到空變量tabEdicao的錯誤。

由於您似乎沒有在後臺bean中使用tabview變量,我的建議是擺脫它。如果你真的需要它,只是初始化:

private TabView tabEdicao = new TabView(); 
0

Kolossus:當我加入了attibute dynamic="true"到對話框

這個問題就解決了。其實,真正的價值是dynamic=#{empty proprietarioMB.proprietario},因爲我在加載頁面時創建了NullPointerExceptionproprietario屬性被加載到@PostConstruct方法。