Захват "Отмена" выбора из ответа GWT Activity.mayStop () - PullRequest
2 голосов
/ 30 января 2012

У меня GWT с двумя колонками.Левый столбец содержит CellTable со списком пользователей в приложении.Когда пользователь выбирает пользователя из списка, в правом столбце отображаются сведения о выбранных пользователях, которые пользователь может редактировать.

У меня подключен Activity для использования метода mayStop(), чтобы перед переключениемпользователи, система будет пытаться сохранить любые несохраненные изменения, сделанные пользователем - до тех пор, пока не будет ошибок валидации.

Мой вопрос касается поведения при наличии ошибок валидации.У меня есть сообщение, чтобы попросить пользователя отменить несохраненные изменения или вернуться на страницу и исправить проблемы.Моя проблема заключается в том, что когда пользователь нажимает кнопку отмены (чтобы вернуть и исправить ошибки), таблица ячеек все еще «выбирает» нового пользователя, вместо того чтобы оставить пользователя, который находится в выбранном столбце сведений.Похоже, что отключение от пользовательской активности было отменено, но GWT все еще делает выбор CellTable.Есть ли способ зафиксировать выбор «Отмена» или остановить выбор таблицы ячеек?

Ответы [ 2 ]

4 голосов
/ 31 января 2012

Если посмотреть на источник PlaceController, который запускает возможные вызовы mayStop() и onStop(), вызываются два разных события, по одному для каждого. PlaceChangeRequestEvent идет первым, указывая (как и ожидалось), что изменение запрашивается, но еще не закончено. Это вызовет mayStop ().

Затем, если пользователь не решает отменить изменение, PlaceChangeEvent увольняется, что вызывает onStop(). В противном случае это никогда не будет называться.

Мой подход заключается в том, чтобы основывать фактический выбор в левом столбце на основе этих событий. Нет удобного способа остановить / отменить выбор, поэтому нет хорошего способа фактически управлять выбором и отложить его после того, как пользователь предоставит свой отзыв. Моя мысль будет либо

  • На самом деле не выбирайте, когда пользователь нажимает кнопку, просто измените место. Затем, когда PlaceChangeEvent срабатывает, фактически сделайте выбор. Это немного грубо, так как я не вижу удобного способа отменить выбор. Или
  • Отслеживать последний выбранный элемент после того, как пользователь изменил выбор (в отличие от места). Прослушайте PlaceChangeRequestEvent и запланируйте отложенную команду, чтобы выбрать этот оригинальный элемент, и прослушайте PlaceChangeEvent, чтобы пропустить текст этой команды. Это должно работать, так как предупреждение, представляемое пользователю, блокируется - хотя я на самом деле не проверял его.

Если вы связываете изменения места с URL-адресом, вам уже нужен обработчик PlaceChangeEvent, чтобы следить за тем, как пользователь нажимает кнопки «вперед» / «назад» в браузере, так что имейте это в виду, когда решаете, как это сделать - изменение места должно выбор диска, точно так же, как выбор должен управлять местом, но если пользователь щелкает назад и отменяет изменение места, тогда таблица ячеек должна сохранить свой первоначальный выбор.

0 голосов
/ 31 декабря 2013

Я только что закончил реализацию этого на основе информации из нескольких источников. Вот то, что я придумал, и это сработало для меня.

Все ячейки в виджете ячеек должны быть переопределены, чтобы возвращать true для handlesSelection (), например:

/**
 * 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;
    }
}

Затем вы должны обработать событие выбора через CellPreviewEvent (которое происходит до того, как происходит выбор, в отличие от SelectionChangeEvent). Я использовал DataGrid, но это также должно работать на 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()));
        }
    }
});

Это запускает событие запроса на изменение места, которое вызывает PlaceController (). GoTo (). Это инициирует проверку mayStop () в Activity. Тогда ваша активность должна справиться с этим взаимодействием.

В моем случае у меня есть одиночный ведущий. Так что я рассказываю ведущему о новом месте. Этот вызов обновляет представление для выбора соответствующей строки.

Кроме того, у меня все еще правильно работает selectionModel:

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

Таким образом, после выбора этой новой строки запускается другое событие для обновления другой части пользовательского интерфейса на основе нового выбора.

  • «Не выбирать, когда пользователь нажимает» обрабатывается пользовательское переопределение ячейки.
  • Часть "эффект изменения места" обрабатывается CellPreviewHandler и PlaceController.goTo (Place).
  • Все остальное обрабатывается реализацией ваших действий и мест.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...