2013-05-03 12 views
5

La funzione JSF 2.x supportata dell'elaborazione sequenziale di più eventi ajax non funziona per me. ho ottenuto il seguente scenario:La coda eventi ajax JSF non funziona su evento-evento dopo evento di modifica

  1. h: inputText (CAMBIO)

    <h:inputText id="consumption_input" 
        value="#{cc.attrs.consumptionInfo.consumption}"> 
        <f:ajax 
        render="#{cc.attrs.outerRenderString}" 
        event="change" listener="#{cc.handleAjaxRequest}" /> 
    </h:inputText> 
    
  2. h: commandButton (ACTION)

    <h:commandButton 
        id="startComparisonButton" 
        action="#{rateComparisonBean.startRateComparison()}" 
        value="#{bundle.rateResultOverview_startComparison}"> 
        <!-- This is to avoid mixed requests, ajax and full requests --> 
         <f:ajax render="@form"/> 
        </h:commandButton> 
    

Gli eventi di entrambi gli elementi sono gestito correttamente se attivato da solo.

Il problema si verifica quando entrambi gli eventi vengono attivati ​​con un clic (immettere un valore in textInput e successivamente fare clic sul pulsante). Mi aspettavo che questo portasse a due richieste di ajax attivate in modo sincrono (CHANGE-TextField e ACTION-commandButton).

Purtroppo c'è solo un Ajax-Request (Change-TextField), il secondo evento sembra essere completamente perso.

ho già assicurato che tutti i pre-condizioni per un h: commandButton sono pieni pieni, come sottolineato qui: commandButton/commandLink/ajax action/listener method not invoked or input value not updated

Gradirei ottenere alcun suggerimento su come risolvere questo problema.

Ambiente: Glassfish 3, Mojarra 2.1.3-FCS

+0

Interessante ... lo hai verificato in un'applicazione piccola e facilmente replicabile? È possibile scambiare Mojarra con MyFaces e vedere se si ottiene lo stesso comportamento? –

+0

Hai mai avuto * un comportamento * atteso con due ascoltatori (azione) licenziati? – skuntsel

+0

Hai trovato una soluzione? Sono di fronte allo stesso problema. –

risposta

3

Le chiamate JSF AJAX sono asincrone. L'invio di una richiesta AJAX, in questo caso generata dall'evento <h:inputText>onchange, non interrompe JavaScipt per continuare la sua esecuzione e, in questo caso, attiva il clic sul pulsante di invio, che a sua volta attiva un'altra richiesta AJAX. Tuttavia, le richieste AJAX sono realmente in coda sul client, per essere elaborate nell'ordine esatto in cui sono state inviate, il che è garantito da JSF 2.0 specification, capitolo 13.3.2.

Qui di seguito è il mio banco di prova:

La vista:

<h:form id="form"> 
    <h:inputText id="text" value="#{q16363737Bean.text1}"> 
     <f:ajax render="text2" event="change" listener="#{q16363737Bean.ajaxListenerText}"/> 
    </h:inputText> 
    <h:commandButton id="button" action="#{q16363737Bean.actionButton}" value="Submit"> 
     <f:ajax render="text1 text3" listener="#{q16363737Bean.ajaxListenerButton}"/> 
    </h:commandButton> 
    <br/> 
    <h:outputText id="text1" value="Text 1: #{q16363737Bean.text1}."/> 
    <h:outputText id="text2" value="Text 2: #{q16363737Bean.text2}."/> 
    <h:outputText id="text3" value="Text 3: #{q16363737Bean.text3}."/> 
</h:form> 

Il fagiolo:

@ManagedBean 
@ViewScoped 
public class Q16363737Bean implements Serializable { 

    private String text1 = "I'm text 1";//getter + setter 
    private String text2 = "I'm text 2";//getter + setter 
    private String text3 = "I'm text 3";//getter + setter 

    public void ajaxListenerText(AjaxBehaviorEvent abe) { 
     text2 = "I was modified after inputText AJAX call"; 
    } 

    public void ajaxListenerButton(AjaxBehaviorEvent abe) { 
     text1 = "I was modified after AJAX listener call of commandButton"; 
    } 

    public void actionButton() { 
     text3 = "I was modified after commandButton AJAX call"; 
    } 

} 

Dopo aver esaminato la questione per qualche tempo ho davvero capito che molto raramente la chiamata AJAX del pulsante di comando era stata ingoiata e d non sono stati effettuati aggiornamenti dell'interfaccia utente. Sembra che ci dovrebbero essere alcune condizioni di gara da qualche parte. È una grande domanda e deve essere approfondita ulteriormente.

Quindi, questa probabilmente non è una risposta (anche se pensavo che sarebbe stata inizialmente), ma una proposizione per un caso di test. E nonostante il fatto che ho affrontato questo comportamento molto di rado, si tratta di un caso di uso reale , e vale la pena comprendere appieno cosa sta succedendo.

0

Primo ringraziamento per la risposta veloce e sofisticata.

Un secondo test da zero ha evidenziato che gli eventi ajax sono accodati correttamente.

Quindi, di nuovo ho controllato lo scenario più complesso descritto sopra. La causa per le giunture dell'evento saltate deve essere correlata al nostro 'overlay occupato'. Consideralo come un gruppo di JavaScript che disabilita gli elementi del modulo e applica una sovrapposizione durante le richieste ajax di lunga durata. Ciò avviene applicando una richiamata jsf.ajax.addOnEvent.

Ad ogni modo, anche disabilitiamo alcuni controlli, dopo "successo" il modulo è in uno stato corretto e il secondo evento potrebbe essere gestito.

Attualmente presumo che il pulsante "temporaneamente" disabilitato comprometta l'evento di azione correlato che dovrebbe essere eseguito successivamente.

Attualmente stiamo analizzando il problema e pubblicherò il risultato finale al più presto.

+0

Hai trovato una soluzione? So che questo è stato pubblicato un po 'indietro ma sto affrontando lo stesso problema. Non riesco a trovare una soluzione senza rimuovere la "sovraimpressione occupata" o ritardarla. –

Problemi correlati