Ho una forma semplice che contiene una casella di modifica e un pulsante:validatori asincroni in JSF
<h:form id="addForm">
<h:outputLabel value="Add item here" /><br />
<p><h:inputText id="itemInput" value="#{myController.itemToAdd}" validator="myValidator" />
<h:message for="itemInput" /></p>
<h:commandButton value="Add" action="#{myController.addItemToList}">
<f:ajax execute="@form" render="@form :addedItems" />
</h:commandButton>
</h:form>
Quando l'utente fa clic sul pulsante, un po 'la convalida di base è fatto e se tutto va bene, è aggiunta la voce ad una tabella di dati:
<h:panelGrid id="addedItems">
<h:dataTable value="#{myController.itemMap.entrySet()}" var="itemMapEntry" >
<h:column>
<f:facet name="header">
<h:outputText value="Items" />
</f:facet>
<h:commandButton value="Remove/Modify" action="#{myController.removeItemFromList(itemMapEntry.getKey())}">
<f:ajax render=":addedItems :addForm" />
</h:commandButton>
<h:outputText value="#{itemMapEntry.getKey()}" />
</h:column>
<h:column>
<f:facet name="action">
<h:outputText value="" />
</f:facet>
<h:outputText value="#{itemMapEntry.getValue().toString()}" id="itemValidationStatus" />
</h:column>
</h:dataTable>
</h:panelGrid>
Ora, quello che voglio ottenere è quando l'utente inserisce un elemento, il primo, preliminare, la convalida è fatto e se la convalida è riuscita l'elemento viene aggiunto al tavolo dove la lista viene visualizzato insieme allo stato di convalida (ad es. convalida, non valido, valido). Quando l'elemento viene aggiunto alla tabella, viene avviata un'altra convalida, più dispendiosa in termini di tempo, e al termine della convalida viene aggiornato l'itemValidationStatus nella tabella. Non voglio bloccare l'utente durante la convalida che richiede tempo. Invece, voglio consentire all'utente di aggiungere più elementi mentre gli elementi già aggiunti vengono convalidati.
Vedo tre modi per risolvere questo:
per registrare un qualche tipo di JS osservatore che reagire a un oggetto è in fase di aggiornamento nel bean gestito
Per attivare il rendering da il bean gestito che renderebbe possibile genera un thread di convalida che, sulla rifinitura, innescare il rendering di
C'è qualche modo per iniziare in modo asincrono la convalida tramite JS e registrare una funzione di callback che o attivare il rendering di o aggiornare il valore direttamente
Il problema è che non riesco a trovare nulla online che avrebbe indicami la giusta direzione Sto cercando di risolvere questo problema con un semplice JSF (senza Prime Faces o strumenti simili).
EDIT:
mi è stato suggerito un'altra domanda come un possibile duplicato (JSF, aggiornare periodicamente un componente con AJAX?). Non sto cercando una soluzione per sondare peridicamente, ma per aggiornare quando i dati sottostanti cambiano. E cambierà solo una volta, quindi la soluzione ovvia sarebbe un ascoltatore di eventi o simile. Certo, questo potrebbe anche essere risolto con sondaggi periodici, ma questo mi sembra un livello molto basso per quello che sto cercando.
possibile duplicato (http://stackoverflow.com/questions/11228198/jsf-refresh-periodically-a-component-with-aax) – DavidS
D'accordo quindi, non in realtà un duplicato. Mi chiedo se JSF sia adatto per questo. Correzione – DavidS
: "plain JSF" (come OP intendeva solo il set di set di componenti JSF standard disponibile). OP è in questo modo davvero in grado di camminare sul proprio piede. Solo il futuro JSF 2.3 verrà fornito con il supporto push "nativo". – BalusC