2011-09-30 5 views
13

Ho una piccola applicazione Vaadin che ha diversi campi di input (caselle combinate, gruppi di selezione, ecc ...). Il contenuto della maggior parte di questi è determinato dal contenuto scelto del primo ComboBox. Tuttavia, quando seleziono qualcosa al suo interno, tutti gli altri rimangono vuoti finché non faccio clic su uno, a quel punto si aggiornano tutti. Questo non è un comportamento desiderato, ma presumo che sia causato dal fatto che il lato server sia aggiornato ma non sta aggiornando la vista lato client. (Anche quando si aggiunge requestRepaint() nel mio primo ValueChangeListener di Combobox)Come posso forzare Vaadin ad aggiornare lo schermo?

Ci deve essere un metodo per forzare Vaadin a ottenere i dati che voglio che vengano visualizzati anche se non si fa clic su nessun altro componente?

EDIT io non sono autorizzato a inviare le risposte alla mia domanda così presto, quindi sto mettendo qui temporaneamente:

ho scoperto che c'è un metodo JavaScript che sincronizza client e server.

myComponent.getApplication().getMainWindow().executeJavaScript("javascript:vaadin.forceSync();"); 

L'unico problema che ho ora è che il ValueChangeListener su uno dei miei comboboxes ancora solo fuochi quando clicco un'altra combobox (o lo stesso due volte). È la cosa più strana perché la seconda casella combinata, quando caricata, lancia perfettamente l'evento.

risposta

17

È il primo ComboBox in modalità "immediata"?

In caso contrario, probabilmente dovrebbe essere: component.setImmediate (true).

Vedi https://vaadin.com/book/-/page/components.selection.html

+1

Questo l'ha risolto, non posso credere di averlo perso perché avevo già impostato correttamente l'altro. Lascerò la mia risposta nel mio post e selezionerò questa come accettata – Valyrion

3

C'è un trucco che puoi usare se hai impostato un'origine dati per i tuoi componenti che costringe il vaadin a ri-renderli. Io lo uso per aggiornare tabelle che hanno dati dinamici

yourcomponent.setContainerDataSource(yourcomponent.getContainerDataSource()); 
+1

Eww. =) Sono sorpreso che il caso non sia stato ancora ottimizzato dal team di sviluppo. –

2

Hai richiestoRipaint sui componenti corretti?

Ricordare che requestRepaint contrassegna il componente come sporco ma non significa che verrà ridipinto - un client può essere aggiornato solo quando effettua una richiesta al server.

Vedere questa discussione https://vaadin.com/forum/-/message_boards/view_message/231271 per ulteriori informazioni sulle opzioni (si occupa degli aggiornamenti dell'interfaccia utente a causa dell'elaborazione del thread in background).

0

In Vaadin 7 è sufficiente mettere questa linea in UI.init principale metodo (VaadinRequest):

UI.getCurrent().setPollInterval(1000); 

se si desidera aggiornare l'interfaccia utente (in questo caso) ogni secondo. In questo modo si istruisce l'interfaccia utente per interrogare il server per le modifiche nell'intervallo definito.

Attenzione, il traffico eccessivo del server potrebbe essere un problema se ci sono molti utenti che usano l'applicazione allo stesso tempo.

In Vaadin 6 si dovrà giocare con ProgressIndicator (che potrebbe essere invisibile se volete) e cercare di fare il simile quello che fa UI.getCurrent(). SetPollInterval (int) in Vaadin 7.

+0

Non è una buona idea. Mi piacerebbe consigliare server push per questo scopo. Anche se questo non sembra essere il problema dell'OP. – Pere

0

Ho avuto lo stesso problema, vedere di seguito come potrebbe essere fatto nella versione 8.0.5 (2107):

@Push 
public class WebUi extends UI { 
    public void fireComponentUpdated() { 
     getUI().push(); 
    } 
}