2012-03-08 7 views
26

Mam formularza wewnątrz okna, które ja zamknąć, klikając na CommandButton z AJAX,Jak znaleźć wskazanie błędu walidacji (wymagane = „true”) robiąc ajax polecenie

tak

<h:commandButton value="Add" action="#{myBean.addSomething(false)}" 
    id="add_something_id" > 
    <f:ajax render="@form someTable" execute="@form" 
     onevent="closeAddNewSomethingDialogIfSucceeded"></f:ajax> 
</h:commandButton> 

i oto kod js do zamykania okna dialogowego

function closeAddNewSomethingDialogIfSucceeded(data) { 
     if(data.status === 'success') { 
      $("#dialog_id").dialog("close"); 
     } 
    } 

żadnych problemów till tutaj ...

Teraz zmieniłem niektóre dialogowych pól formularza do required="true" i teraz chcę, aby zapobiec zamknięciu okna z Dostałem błędy sprawdzania poprawności ...

Ale ajax data.status nadal osiąga stan success, a ja nie mogę dowiedzieć się, co wskazanie niepowodzenia sprawdzania poprawności mogę podłączyć ...

jakieś pomysły?

Dzięki BalusC odpowiedź Zrobiłem następujące:

w JSF, dodał:

<h:panelGroup id="global_flag_validation_failed_render"> 
     <h:outputText id="global_flag_validation_failed" value="true" 
      rendered="#{facesContext.validationFailed}"/> 
    </h:panelGroup> 

f: ajax zamieniono

<f:ajax render="@form someTable global_flag_validation_failed_render" 

aw js dodał po sprawdzeniu

if(data.status === 'success') { 
    if($("#global_flag_validation_failed").length === 0){ 
     $("#dialog_id").dialog("close"); 
    } 
} 

Odpowiedz

49

Nieprzeznaczone specjalnie dla numeru required="true", ale można sprawdzić, pod numerem #{facesContext.validationFailed}, czy walidacja ogólnie się nie udała. Jeśli połączyć to z sprawdzenie czy przycisk w pytaniu jest dociskana przez #{not empty param[buttonClientId]}, można umieścić go razem w atrybucie <h:outputScript>rendered następująco:

<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}"> 
    <f:ajax execute="@form" render="@form someTable" /> 
</h:commandButton> 
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}"> 
    $("#dialog_id").dialog("close"); 
</h:outputScript> 

(zauważ, że trzeba się upewnić, że skrypt jest również ponownie renderowany przez f: ajax)

Trochę hackowaty, ale nie można go obsłużyć w funkcji onevent, ponieważ standardowa implementacja JSF nie dostarcza żadnych informacji o statusie sprawdzania poprawności w odpowiedzi ajax .

Jeśli używasz RichFaces, możesz po prostu użyć EL w atrybucie oncomplete przycisku/linku komend <a4j:xxx>.Są one mianowicie oceniać na podstawie na żądanie, a nie na zasadzie per-view, jak w standardzie JSF i PrimeFaces:

<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $('#dialog_id').dialog('close')" /> 

A jeśli zdarzy się użyć PrimeFaces, to może skorzystać z faktu, że PrimeFaces obejmuje reakcję aJAX dodatkową args.validationFailed atrybutu, który wstrzykuje się bezpośrednio w zakresie JavaScript atrybutu oncomplete:

<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) $('#dialog_id').dialog('close')" /> 

(Uwaga &amp; jest używany zamiast &, ponieważ & jest szczególnym Charact w XML/XHTML)

Albo możesz użyć interfejsu API PrimeFaces 'RequestContext w metodzie działania komponentu bean, aby programowo wykonać JavaScript w renderowanym widoku.

RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')"); 

Nie są wymagane żadne kontrole warunkowe, ponieważ metoda działania komponentu bean nie będzie wywoływana w każdym razie, gdy sprawdzanie poprawności zakończy się niepowodzeniem.

+0

podziękowaniem! ostatecznie użyłem powoływać się na # {facesContext.validationFailed} (nie wiedziałem o tym) Użyłem go w stanie renderowania prostego outputext ... i później W kodzie js sprawdziłem dla tego wyjścia outputtext używając jquery .length ... – Daniel

+0

Nie ma za co. Aby uzyskać przegląd niejawnych obiektów EL w JSF, zobacz także [this] (http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ImplicitELObjects). – BalusC

+1

@ BalusC Czy faceContext.validationFailed dotyczy również błędów konwersji? Czy to prawda, jeśli konwersja się nie udała? – Bren

2

Myślę, że powinieneś rzucić okiem na PrimeFaces 'RequestContext. Pomoże to w uruchomieniu kodu po stronie klienta po stronie serwera.

2

dwie rzeczy 1) sprawdzenie za błąd w „” onEvent funkcji

pewnością masz tag wiadomość dla pola obowiązkowe?

<h:message id="m-my-field-id" for="my-field-id" errorClass="error-class"/> 

Więc można sprawdzić za błąd klasy coś podobnego

var message = $('#m-my-field-id'); 

if(message.hasClass('error-class'){ 
    //do this 
} 
else{ 
    //do that 
} 

2) DOM nie jest aktualne w przypadku sukcesu

Tak, widzę komunikat na stronę w Firefoksie, ale jQuery mówi mi, że jej tam nie ma.

I odkryli, że stosując najmniejszą możliwą limit czasu jest wystarczająca, aby rozwiązać ten

setTimeout(
    function(){ 
    setErrorStyle(source.attr('id')); 
    }, 
    1 
); 
Powiązane problemy