2012-04-23 16 views
8

Po określeniu atrybutu process znacznika p:ajax detektor nie zostanie wykonany. Jeśli pominę atrybut process, wówczas detektor zostanie wywołany zgodnie z oczekiwaniami.PrimeFaces Ajax Listener nie jest wykonywany, gdy atrybut procesu jest określony dla innego komponentu

Oto fragment widoku:

<p:messages id="messages" /> 
<h:inputText id="inputToProcess" value="#{controller.inputToProcess}" /> 
<p:selectBooleanCheckbox id="testCheckbox" > 
    <p:ajax event="change" process="inputToProcess" 
    update="messages @this inputToUpdate" 
    listener="#{controller.processChecked}" /> 
</p:selectBooleanCheckbox> 
<h:inputText id="inputToUpdate" value="#{controller.inputToUpdate}" /> 

A Kontroler:

@javax.faces.bean.ManagedBean 
@javax.faces.bean.ViewScoped 
public class Controller implements Serializable { 
    private String inputToProcess; 
    private String inputToUpdate; 
    //getters and setters 

    public void processChecked(javax.faces.AjaxBehaviorEvent e) { 
    // doing some stuff here 
    } 
} 

I załączeniu phaseListener do widoku z ANY_PHASEPhaseId, i oto co zauważyłem.

Kiedy określić process atrybut, wartość inputToProcess wejście jest z powodzeniem ustawić regulator w fazie aktualizacji modelu (nie wyjątek). Następnie wykonywane są fazy Invoke Application i Render Response, ale nie jest wywoływany żaden detektor. Zauważyłem tylko, że pole wyboru nie jest ustawione na końcu. Ale nie ma błędów konwersji lub sprawdzania poprawności, ponieważ, jak już powiedziałem, są wykonywane fazy Update Model i .

Jeśli pominąć atrybut process, oto co widzę: słuchacz jest zwykle nazywane w fazie Invoke Application (od immediate jest fałszywe domyślnie), a następnie `Render Response jest wykonana. Pole wyboru zostało pomyślnie ustawione.

Czy istnieje jakieś wytłumaczenie tego rodzaju zachowania?

+0

Co się stanie, jeśli dodasz '@ this' do' process'? Co się stanie, jeśli użyjesz standardowego pola wyboru JSF i komponentów ajax zamiast PrimeFaces? – BalusC

+0

@ BalusC Jestem zmęczony licząc ile razy mi pomogłeś. Dzięki za tonę! Dodanie '@ this' do' process' zadziałało dla mnie. Czy jesteś w stanie wyjaśnić, dlaczego? Myślałem, że 'słuchacz' powinien zostać wywołany bez względu na to, czy' @ to' jest określone w 'procesie' czy nie. Czy to może być problem? Problem ze standardowym polem wyboru JSF i komponentów ajax polega na tym, że detektor jest wywoływany w fazie 'Process Validations', ale muszę najpierw zaktualizować model! Anywho, zaksięguj to jako odpowiedź, chętnie bym to zaakceptował. – jFrenetic

+0

Problem został dodany na stronie: https://github.com/primefaces/primefaces/issues/509, ale nie chcą tego naprawić. Wejdź, komentuj i zagłosuj na to. – GreenieMeanie

Odpowiedz

15

To powinno działać dobrze na pierwszy rzut oka. Przynajmniej działa to dobrze w przypadku używania standardowych komponentów JSF. Założę się, że to błąd lub "funkcja" PrimeFaces, że nie przetwarza akcji, gdy komponent akcji nie jest zawarty w process. Dodanie @this do process powinno rozwiązać problem. Rozważ opublikowanie raportu o problemie dla facetów z PrimeFaces.

Ponadto, wolałbym użyć event="valueChange" lub event="click" zamiast event="change" lub po prostu usunąć event ogóle, to domyślnie prawej wartość już (valueChange który uczyni onclick w pole wyboru i przycisk radiowy komponenty). Zdarzenie change działa inaczej w MSIE dla pól wyboru i radiobutonów. Wywoływany jest tylko w przypadku drugiego kliknięcia. Nie chcesz być zależny od przeglądarki.


jak na swój komentarz:

Problem ze standardowymi checkbox i Ajax JSF komponentów jest to, że słuchacz jest wywoływany podczas walidacji procesów fazy, ale muszę najpierw zaktualizować model!

To nie jest prawda. Prawdopodobnie używałeś valueChangeListener zamiast <f:ajax listener> lub myląc jedno z drugim. <f:ajax listener> jest zawsze wywoływany podczas fazy uruchamiania invoke.

+0

Doskonale! Miałeś rację, użyłem 'valueChangeListener'. Ostatnie pytanie. W przypadku 'f: ajax', jakie wydarzenie należy podać? Czy też domyślnie jest to właściwa wartość, a także 'p: ajax'? – jFrenetic

+2

Tak, robi. Wartością domyślną jest zawsze 'event =" valueChange "' dla komponentów 'UIInput' oraz' event = "akcja" 'dla komponentów' UICommand'. W komponentach 'UIInput' przełoży się na' change' dla elementów HTML input/select/textarea oraz na 'click' dla elementów HTML radio/checkbox. – BalusC

+1

Chociaż "proces" domyślnie "@ this", jak opisano w dokumentacji Primefaces, "@ this" jest zaskakująco nie przetworzone, jeśli masz inne identyfikatory składników w "procesie". –

Powiązane problemy