2014-03-05 3 views
7

So versuche ich, die Antwort von BalusC in this post zu implementieren, aber es funktioniert nicht, wenn ich versuche, die erforderliche Bedingung auf eine Schaltfläche außerhalb einer Wizard, dass Ich benutze, um den "Zurück" und "Nächsten" des Assistenten zu steuern. Wie kann dies erreicht werden?Erforderliche Validierung abhängig von bestimmten Schaltfläche nicht im Assistenten

<h:form id="form" enctype="multipart/form-data" acceptcharset="ISO-8859-1" > 

    <p:growl id="growl" sticky="true" showDetail="true"/> 

    <p:wizard id="wizard" flowListener="#{myBean.onFlowProcess}" showNavBar="false" widgetVar="wizardWV"> 

     <p:tab id="tab1" title="Tab 1" > 
      <p:panel header="Panel for tab 1"> 

       <p:message for="year" /> 
       <br /> 

       <table> 
        <tr> 
         <td> 
          <h:outputLabel value="Year: " /> 
         </td> 
         <td> 
          <p:inputMask 
           id="year" 
           value="#{myBean.year}" 
           required="#{not empty param[nextPanel.clientId]}" 
           requiredMessage="Year is required!" 
           style="width:70px;" 
           mask="9999" 
           maxlength="4" 
          /> 
         </td> 
        </tr> 
       </table> 
      </p:panel> 
     </p:tab> 

     <p:tab id="tab2" title="Tab 2" > 
      <p:panel header="Panel for tab 2"> 
      </p:panel> 
     </p:tab> 

    </p:wizard> 

    <p:commandButton id="backPanel" value="Back" onclick="PF('wizardWV').back();" styleClass="internalButton" /> 
    <p:commandButton id="nextPanel" binding="#{nextPanel}" value="Next" onclick="PF('wizardWV').next();" styleClass="internalButton" /> 

</h:form> 
+4

den Zurück-Button des Assistent wird in erster Linie wirklich brauchen eine vollständige Postbacks (einreichen das gesamte Formular) durchzuführen? Sieht so aus, als könnte es nur ein 'type =" button "' oder ein '' sein (mit 'return false' am Ende von' onclick'). Dies würde auch sofort das Problem der "unnötigen Validierung" lösen. Sonst füge einfach 'process =" @ this "' hinzu, wenn du unbedingt ein Postback machen musst. – BalusC

+0

@BalusC ,, Danke für die Antwort, aber ich habe es nicht bekommen ... die Schaltfläche als mit Rückgabe false; am Ende von onclick, oder das Hinzufügen von process = "@ this" für den hat mein Problem nicht gelöst. Der nächste Button geht immer noch zum nächsten Panel, ohne etwas zu bestätigen.und ich brauche, dass jedes Panel nur validiert wird, wenn ich in die nächste Schaltfläche klicke. – PMBG

+0

Ich habe nichts über den nächsten Button gesagt. – BalusC

Antwort

1

Warum wurde diese Frage nicht beantwortet? wie @BalusC sagte, die Antwort ist einfach, gerade auf @process="this"

<h:form> 
    <p:wizard id="wizard" showNavBar="false" widgetVar="wizardWV"> 
     <p:tab id="tab0" title="Tab 0"> 
      <p:panel header="Panel for tab 0"> 
       blablabla 
      </p:panel> 
     </p:tab> 

     <p:tab id="tab1" title="Tab 1"> 
      <p:panel header="Panel for tab 1"> 
       <p:message for="year" /> 
       <br /> 

       <h:panelGrid columns="2"> 
        <h:outputLabel value="Year: " /> 
        <p:inputMask id="year" value="#{myBean.year}" required="true" 
         requiredMessage="Year is required!" style="width:70px;" mask="9999" 
         maxlength="4" /> 
       </h:panelGrid> 
      </p:panel> 
     </p:tab> 

     <p:tab id="tab2" title="Tab 2"> 
      <p:panel header="Panel for tab 2"> 
       blablabla 
      </p:panel> 
     </p:tab> 
    </p:wizard> 

    <p:commandButton value="Back" onclick="PF('wizardWV').back();" /> 
    <p:commandButton process="@this" value="Next" onclick="PF('wizardWV').next();" /> 
</h:form> 

oder besser, doppeltem Ajax-Request

<p:commandButton type="button" value="Back" onclick="PF('wizardWV').back();" /> 
<p:commandButton type="button" value="Next" onclick="PF('wizardWV').next();" /> 

zu vermeiden, aber ich wirklich nicht den Punkt in mit einem benutzerdefinierten nav sehen Bar für den Assistenten in diesem Fall.


wenn du meinst „Haut“ von „Design“, der richtige Ansatz zu erwähnen ist PF CSS-Stile außer Kraft zu setzen:

Wizard resides in a container element that style and styleClass attributes apply. 
Following is the list of structural css classes. 

Selector    Applies 
.ui-wizard    Main container element. 
.ui-wizard-content  Container element of content. 
.ui-wizard-step-titles Container of step titles. 
.ui-wizard-step-title Each step title. 
.ui-wizard-navbar  Container of navigation controls. 
.ui-wizard-nav-back Back navigation control. 
.ui-wizard-nav-next Forward navigation control. 

Aber wenn Sie wirklich bedeuten „Design“, soll ähnliche Funktionen/Funktionalitäten Ja, Sie können mit dem Assistenten über sein "Widget" interagieren und wie Sie selbst Ihre eigenen Steuerelemente definieren. In Ihrem speziellen Fall sehe ich nicht einen "Design" Unterschied, ich sehe ein Standardverhalten der Wizard-Komponente, wo aktuelle Wizard Registerkarte verarbeitet wird (und alle seine Komponenten validiert) auf nächsten Knopf gedrückt.

Validation ist NUR für verarbeitete Komponenten ausgelöst (die innerhalb Ausführungsliste sind), und Sie können diese Liste steuern mit process="..." Attribut jeder Ajax-Komponente/Ereignis.

Was Sie wahrscheinlich wollen, ist das Standardverhalten von anderen Komponenten in dieser Seite weicht @all oder @form Prozesse zu ändern.

Von dem, was Sie in Ihrem Kommentar sagen, haben Sie mindestens eine andere Komponente auf dieser Seite, die ein AJAX-Verhalten hat, wie eine p:autocomplete und wahrscheinlich verwenden Sie PF < 4.0.

In diesem Fall können Sie process="@this" zum p:autocomplete hinzufügen Verarbeitung (und dann Validierung) zu verhindern, von anderen Komponenten innerhalb des Assistenten Registerkarte wie Ihre p:inputMask.


@Erick, das erste, was mir in den Sinn kommt, ist dies:

<p:wizard binding="#{wizardComponent}" ...> 
    <p:tab id="tab0" ...> 
     ... 
    </p:tab> 
    ... 
</p:wizard> 
<p:commandButton rendered="#{wizardComponent.step != 'tab0'}" value="Back" onclick="PF('wizardWV').back();" /> 
+0

danke für die Antwort. Erstens, der Punkt bei der Verwendung einer benutzerdefinierten Navigationsleiste ist die Möglichkeit, Ihre eigenen entworfenen Schaltflächen zu verwenden. Zweitens hast du nicht verstanden, was ich zu tun versuche. Die erforderliche Bedingung kann nicht erfüllt sein, die Validierung kann NUR durch die nächste Schaltfläche ausgelöst werden. Wie Sie es vorgeschlagen haben, löst jedes andere Element auf der Seite, das mit der Face-Bean iteriert, die Überprüfung aus, z. B. eine automatische Vervollständigung von Primefaces. – PMBG

+0

siehe aktualisierte Antwort. –

+0

Wie kann ich bei Verwendung einer benutzerdefinierten Nav-Var die Zurück-Taste nur bei Bedarf anzeigen? d. h .: nicht in der ersten Registerkarte – Erick