2013-01-17 13 views
5

Próbuję użyć wartości podstawowych <p:dialog> w połączeniu z <p:commandButton>. Na mojej stronie .xhtml mam listę wyboru i commandButton, która służy do wyświetlania okna dialogowego. Wyświetlane okna dialogowe z wartościami docelowymi z listy wyboru. Okno dialogowe ma dwa przyciski: anuluj i prześlij. Mój problem polega na tym, że przycisk przesyłania nie jest uruchamiany. Co dziwne, działa commandButton z okna dialogowego.Okno dialogowe Primefaces + commandButton

Oto mój .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> 

Zaznaczyłem przycisk działa i nie działa jeden. Co muszę zrobić, aby działało?

+0

Czy patrzyłeś na konsolę, jej nie wywołuje ajax? czy po prostu nie działa? Spróbuj zajrzeć do firebuga, jeśli jego wysyłanie danych do serwera, czy też wypalanie AJAX i metoda '# {editSkills.showSkillsAndLevels}' nie jest w ogóle wywoływana? Sprawdź również, czy firebug nie wykazuje błędów JS. – Mindwin

+0

@Mindwin wydaje się, że w ogóle nie jest wzywany. Nie widzę też żadnych błędów JS. – AjMeen

Odpowiedz

17

Można spróbować jednej z poniższych czynności, zagłosuję numer jeden, jest to odkurzacz projekt IMO

  1. Doprowadzić <p:dialog/> poza ogólnym <h:form/> i położyć <h:form/>wewnątrz to zamiast

    <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. Dodaj appendToBody="false" do <p:dialog/>, aby zapewnić, że okno dialogowe jest renderowane w formularzu HTML w domenie DOM Dotyk automatycznego przeniesienia na koniec treści HTML. Może to jednak powodować niespójne renderowanie w różnych przeglądarkach.

+0

Dzięki za odpowiedź! Zrobiłem to, co mi kazałeś, ale teraz dostaję ten błąd: '/user/editSkills.xhtml @ 39,121 itemValue =" # {skill.id} ": Klasa 'java.lang.String' nie ma właściwości "id". Co jest dziwne, myślę, że jest powiązane z listą wyboru i jest dziwne, ponieważ lista wyboru działa dobrze. Co powinienem zrobić? – AjMeen

+0

@AjMeen, to zupełnie inny problem, prawdopodobnie spowodowany tym, że '# {skill.id}' i '# {skillslevel.level}' nie są tym samym typem danych (jeden z nich jest ciągiem znaków, drugi to coś innego jeszcze). Ale teraz twój commandButton zdecydowanie strzela. – kolossus

+0

'# {skillslevel.level}' nie ma nic wspólnego z tym błędem, ponieważ nawet jeśli usunę część 'skilsslevel' błąd nadal się wyświetla. Po prostu potrzebuję konwertera. W każdym razie dzięki za pomoc! – AjMeen

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

Należy używać ' gdy u nazwać nazwę widgetVar. Możesz również użyć opcji natychmiast = "true" lub process = "@ this".

+0

nie powinieneś potrzebować natychmiast = "true" lub process = "@ this". Jednak twoja odpowiedź zawierała odrobinę informacji, których potrzebowałem. Dzięki! – Eric