2011-09-30 24 views
13

Tengo una pequeña aplicación Vaadin que tiene varios campos de entrada (comboboxes, selectgroups, etc ...). El contenido de la mayoría de estos está determinado por el contenido elegido del primer ComboBox. Sin embargo, cuando selecciono algo, todos los demás permanecen en blanco hasta que hago clic en uno, en ese punto todos se actualizan. Este no es el comportamiento deseado, pero supongo que es causado por el hecho de que el servidor está actualizado, pero no actualiza la vista del cliente. (Incluso cuando agregue requestRepaint() en mi primer cuadro combinado ValueChangeListener)¿Cómo puedo obligar a Vaadin a actualizar la pantalla?

Debe haber algún método para obligar a Vaadin a obtener los datos que quiero que muestre, incluso si no se hace clic en otros componentes.

EDITAR que no me permiten para publicar respuestas a mi propia pregunta tan pronto, por lo que estoy poniendo aquí temporalmente:

he encontrado que hay un método javascript que sincroniza el cliente y el servidor.

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

El único problema que tengo ahora es que el ValueChangeListener en uno de mis cuadros combinados todavía sólo se activa cuando me haga clic en otro cuadro combinado (o el mismo dos veces). Es lo más extraño porque el segundo cuadro combinado, cuando se carga, dispara su evento perfectamente.

Respuesta

17

¿Es el primer ComboBox en modo "inmediato"?

De lo contrario, probablemente debería ser: component.setImmediate (true).

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

+1

Eso lo solucionó, no puedo creer que lo haya echado de menos porque ya tenía el otro configurado correctamente. Dejaré mi respuesta en mi publicación y seleccionaré esta como aceptada – Valyrion

3

Hay un truco que puedes usar si has configurado una fuente de datos para tus componentes que obliga a vaadin a volver a renderizarlos. Lo uso para actualizar tablas que tienen datos dinámicos

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

Eww. =) Me sorprende que el equipo de desarrollo aún no haya optimizado el caso. –

2

¿Solicitó usted Repaint sobre los componentes correctos?

Tenga en cuenta que requestRepaint marca el componente como sucio pero no significa que se volverá a pintar: un cliente solo puede renovarse cuando realiza una solicitud al servidor.

Consulte este tema https://vaadin.com/forum/-/message_boards/view_message/231271 para obtener más información sobre sus opciones (se trata de actualizaciones de la interfaz de usuario debido al procesamiento de subprocesos en segundo plano).

0

En Vaadin 7 es suficiente para poner esta línea en UI.init principal método (VaadinRequest):

UI.getCurrent().setPollInterval(1000); 

si desea actualizar la interfaz de usuario (en este caso) cada segundo. De esta forma, instruye a la interfaz de usuario para sondear el servidor para cambios en el intervalo definido.

Tenga cuidado, el tráfico excesivo del servidor puede ser un problema si tiene muchos usuarios que usan su aplicación al mismo tiempo.

En Vaadin 6 tendrá que jugar con ProgressIndicator (que podría ser invisible si lo desea) y tratar de hacer lo que hace el similares UI.getCurrent(). SetPollInterval (int) en Vaadin 7.

+0

No es una buena idea. Recomiendo habilitar el servidor para este propósito. Aunque este no parece ser el problema de OP. – Pere

0

Tuve el mismo problema, mire abajo cómo podría hacerse en la versión 8.0.5 (2107):

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