Capturando la selección "Cancelar" de la respuesta GWT Activity.mayStop ()

Tengo una pantalla de dos columnas GWT. La columna de la izquierda contiene un CellTable con una lista de usuarios en la aplicación. Cuando el usuario selecciona un usuario de la lista, la columna de la derecha muestra los detalles de los usuarios seleccionados, que el usuario puede editar.

Yo tengo mi Activity conectado para usar el mayStop() para que antes de cambiar de usuario, el sistema intente guardar los cambios no guardados que haya realizado el usuario, siempre que no haya errores de validación.

Mi pregunta es sobre el comportamiento si hay errores de validación. Lo tengo conectado para pedirle al usuario que descarte las ediciones no guardadas o que regrese a la página y corrija los problemas. Mi problema es que cuando el usuario presiona cancelar (para regresar y corregir los errores), la tabla de celdas aún "selecciona" al nuevo usuario en lugar de mantener seleccionado al usuario que está en la columna de detalles. Parece que se canceló el cambio de la actividad del usuario, pero GWT todavía está haciendo el CellTable selección. ¿Hay alguna forma de capturar la selección "Cancelar" o evitar que se produzca la selección de la tabla de celdas?

preguntado el 30 de enero de 12 a las 19:01

Es difícil sugerir algo concreto, ya que no publicó ningún código real, pero podría extender el SelectionModel que está unido a tu CellTable y anular el setSelected(...) método para no llamar super.setSelected(...) si hay una bandera en particular en algún lugar. Nuevamente, sin los detalles es difícil sugerir algo sólido, pero esa es una dirección que puede explorar. -

2 Respuestas

De mirar la fuente de PlaceController, que desencadena las eventuales llamadas a mayStop() y onStop(), se llaman dos eventos diferentes, uno para cada uno. PlaceChangeRequestEvent va primero, lo que indica (como era de esperar) que se solicita un cambio, pero que aún no ha terminado. Esto llamará a mayStop ().

Luego, si el usuario no elige cancelar el cambio, PlaceChangeEvent es despedido, que llama onStop(). De lo contrario, nunca se llamará.

Mi enfoque sería basar la selección real en la columna de la izquierda en función de estos eventos. No hay una forma práctica de detener / cancelar la selección, por lo que no existe una manera agradable de administrar la selección y retrasarla después de que el usuario proporcione sus comentarios. Mi pensamiento sería

  • En realidad, no seleccione cuándo el usuario hace clic, simplemente efectúe el cambio de lugar. Entonces cuando PlaceChangeEvent está despedido, en realidad haga la selección. Esto es un poco asqueroso, ya que no veo una forma conveniente de cancelar la selección. O
  • Realice un seguimiento del último elemento seleccionado después de que el usuario cambie la selección (a diferencia del lugar). Escuche el PlaceChangeRequestEventy programar un comando diferido para seleccionar ese elemento original y escuchar PlaceChangeEvent para omitir el cuerpo de ese comando. Esto debería funcionar, ya que la alerta presentada al usuario está bloqueando, aunque en realidad no la he probado.

Si está conectando los cambios de lugar a la URL, ya necesita un controlador PlaceChangeEvent para observar si el usuario hace clic en los botones de avance / retroceso del navegador, así que tenga esto en cuenta cuando decida cómo conectar esto: el cambio de lugar debe impulsar la selección, al igual que la selección debe controlar el lugar, pero si el usuario hace clic hacia atrás y cancela el cambio de lugar, la tabla de celdas debe mantener su selección original.

Respondido el 31 de enero de 12 a las 10:01

Acabo de terminar una implementación de esto basándome en las aportaciones de varias fuentes. Esto es lo que se me ocurrió que funcionó para mí.

Todas las celdas de su widget de celda deben anularse para devolver verdadero para handleSelection (), así:

/**
 * This text cell is designed for use in cell widgets that are tied to Places
 * and thus need to have the Activity/Presenter manage the selection to allow
 * for a mayStop() rejection of the navigation (user clicks cancel at prompt).
 */
public class PlaceTextCell extends TextCell
{   
    @Override
    public boolean handlesSelection()
    {
        // So that the selection model won't change the selection automatically.
        return true;
    }
}

Luego, debe manejar el evento de selección a través de un CellPreviewEvent (que ocurre antes de que ocurra la selección, a diferencia de un SelectionChangeEvent). Usé un DataGrid, pero esto también debería funcionar en un CellTable.

selectionDataGrid.addCellPreviewHandler(new CellPreviewEvent.Handler<Dto>() {
    @Override
    public void onCellPreview(CellPreviewEvent<Dto> event) {
        if(Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK ||
       event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)
            {
            eventBus.fireEvent(new MySelectionChangeRequestEvent(event.getValue()));
        }
    }
});

Esto desencadena un evento de solicitud de cambio de lugar que llama a PlaceController (). GoTo (). Esto activará una verificación de mayStop () de la actividad. Entonces su Actividad necesita manejar esa interacción.

En mi caso, tengo un presentador singleton. Entonces le cuento al presentador sobre el nuevo lugar. Esa llamada realiza la actualización de la vista para seleccionar la fila correspondiente.

Además, todavía tengo el selectionModel funcionando correctamente:

selectionModel.addSelectionChangeHandler(new SelectionChangeEvent.Handler() {
    public void onSelectionChange(SelectionChangeEvent event) {
        eventBus.fireEvent(new MySelectionChangeEvent(selectionModel.getSelectedObject()));
    }
});

Entonces, después de seleccionar esta nueva fila, se activa otro evento para actualizar otra parte de la interfaz de usuario en función de la nueva selección.

  • El "No seleccionar realmente cuando el usuario hace clic" lo maneja la anulación de celda personalizada.
  • La parte "efectuar el cambio de lugar" es manejada por CellPreviewHandler y PlaceController.goTo (Place).
  • El resto lo gestiona la implementación de Actividades y lugares.

Respondido el 31 de diciembre de 13 a las 21:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.