2013-01-17 157 views
5

我試圖使用與<p:commandButton>結合的primefaces <p:dialog>。在我的.xhtml頁面中,我有一個選擇列表和用於顯示對話框的commandButton。對話框顯示來自選擇列表的目標值的數據表。對話框有兩個按鈕:取消和提交。我的問題是提交按鈕沒有被解僱。奇怪的是,commandButton不在對話框中。Primefaces對話框+​​ commandButton

這裏是我的.xhtml:

<body> 
    <ui:composition template="./../resources/mainTemplate.xhtml"> 
     <ui:define name="content"> 
      <h:form> 
       <p:dialog id="dlg" header="#{messages.chooseSkillLevel}" widgetVar="dlg" modal="true" dynamic="true"> 
        <h:dataTable value="#{editSkills.skillsAndLevels}" var="skillslevel"> 
         <h:column> 
          #{skillslevel.skill.umiejetnosc} 
         </h:column> 
         <h:column> 
          <p:selectOneMenu value="#{skillslevel.level}" > 
           <f:selectItems value="#{editSkills.levels}" var="level" itemLabel="#{level.stopien}" itemValue="#{level.id}" /> 
          </p:selectOneMenu> 
         </h:column> 
        </h:dataTable> 
        <p:commandButton value="#{messages.confirm}" action="#{editSkills.showSkillsAndLevels}" oncomplete="dlg.hide();" /> THIS BUTTON IS NOT FIRED 
        <p:commandButton value="#{messages.cancel}" onclick="dlg.hide()"/> 
       </p:dialog> 
       <p:pickList value="#{editSkills.skills}" var="skill" effect="none" 
       itemValue="#{skill.id}" itemLabel="#{skill.umiejetnosc}" 
       showSourceFilter="true" showTargetFilter="true" filterMatchMode="contains" 
       addLabel="#{messages.add}" removeLabel="#{messages.remove}" removeAllLabel="#{messages.removeAll}" > 
        <f:facet name="sourceCaption">#{messages.skillsList}</f:facet> 
        <f:facet name="targetCaption">#{messages.yourSkills}</f:facet> 
        <p:ajax event="transfer" listener="#{editSkills.onTransfer}" /> 
        <p:column style="width:100%;"> 
         #{skill.umiejetnosc} 
        </p:column> 
       </p:pickList> 
       <p:commandButton value="#{messages.confirm}" action="#{editSkills.afterSubmit}" update="dlg" oncomplete="dlg.show()" /> THIS BUTTON WORKS FINE 
       <p:commandButton value="#{messages.cancel}" action="profile" immediate="true"/> 
      </h:form> 
     </ui:define> 
    </ui:composition> 
</body> 

我已標記的工作按鈕,不工作之一。 我需要做些什麼才能使它工作?

+0

你看過控制檯,它沒有打一個Ajax電話?或者它根本不工作?嘗試尋找螢火蟲,如果它發送數據到服務器,或者是AJAX射擊和'#{editSkills.showSkillsAndLevels}'方法根本沒有被調用?另外檢查螢火蟲是否沒有顯示任何JS錯誤。 – Mindwin

+0

@Mindwin似乎根本沒有被調用。也看不到任何JS錯誤。 – AjMeen

回答

17

你可以嘗試以下任一,我選了一個數字,這是一個更清潔的設計IMO

  1. 帶上<p:dialog/>外一般<h:form/>的,把一個<h:form/>它,而不是

    <p:dialog id="dlg" header="#{messages.chooseSkillLevel}" widgetVar="dlg" modal="true" dynamic="true"> 
         <h:form> 
          <h:dataTable value="#{editSkills.skillsAndLevels}" var="skillslevel"> 
           <h:column> 
            #{skillslevel.skill.umiejetnosc} 
           </h:column> 
           <h:column> 
            <p:selectOneMenu value="#{skillslevel.level}" > 
             <f:selectItems value="#{editSkills.levels}" var="level" itemLabel="#{level.stopien}" itemValue="#{level.id}" /> 
            </p:selectOneMenu> 
           </h:column> 
          </h:dataTable> 
          <p:commandButton value="#{messages.confirm}" action="#{editSkills.showSkillsAndLevels}" oncomplete="dlg.hide();" /> THIS BUTTON IS NOT FIRED 
          <p:commandButton value="#{messages.cancel}" onclick="dlg.hide()"/> 
          </h:form> 
         </p:dialog> 
    
  2. appendToBody="false"添加到<p:dialog/>以確保對話框在DOM窗體中呈現在DOM中被自動重新定位到HTML主體結束。但是這可能會導致在各種瀏覽器中呈現不一致。

+0

感謝您的回答! 我做了你告訴我要做的,但現在我得到這個錯誤: '/user/editSkills.xhtml @ 39,121 itemValue =「#{skill.id}」:類'java.lang.String'沒有屬性'id'。'奇怪的是我認爲它與選擇列表有關,它很奇怪,因爲選擇列表工作正常。我該怎麼辦? – AjMeen

+0

@AjMeen,完全不同的問題,可能是由於'#{skill.id}'和'#{skillslevel.level}'不是同一個數據類型(其中一個是字符串,另一個是某種其他)。但現在你的命令按鈕肯定是射擊。 – kolossus

+0

'#{skillslevel.level}'與這個錯誤無關,因爲即使我刪除了'skilsslevel'部分,錯誤仍然顯示出來。我可能需要一個轉換器。無論如何感謝您的幫助! – AjMeen

4
<p:commandButton value="Cancel" oncomplete="PF('yourDialogWidgedVarName').hide();" process="@this" /> 

確保使用當u調用widgetVar名。您也可以使用immediate =「true」或process =「@ this」。

+0

你應該不需要immediate =「true」或process =「@ this」。 但是,您的答案有我需要的快速信息。謝謝! – Eric