捕获GWT Activity.mayStop()响应中的“取消”选择

时间:2012-01-30 19:26:11

标签: java events gwt android-activity

我有一个GWT两列显示。左列包含CellTable,其中包含应用程序中的用户列表。当用户从列表中选择用户时,右列显示所选用户的详细信息 - 用户可以编辑。

我已将Activity连接到使用mayStop()方法,以便在切换用户之前,系统将尝试保存用户所做的任何未保存的更改 - 只要没有验证错误

我的问题是关于验证错误的行为。我有线要求用户放弃未保存的编辑或返回页面并更正问题。我的问题是,当用户点击取消(返回并更正错误)时,单元格表仍然“选择”新用户,而不是保持选中详细信息列中的用户。似乎已取消远离用户活动的切换,但GWT仍在进行CellTable选择。有没有办法捕获“取消”选择,或停止发生单元格表选择?

2 个答案:

答案 0 :(得分:4)

通过查看触发最终调用PlaceControllermayStop()的{​​{1}}来源,调用两个不同的事件,每个事件各一个。 onStop()首先表示(可预测)正在请求更改,但尚未完成。这将调用mayStop()。

然后,如果用户没有选择取消更改,PlaceChangeRequestEvent会被触发,这会调用PlaceChangeEvent。否则,永远不会调用它。

我的方法是根据这些事件将实际选择基于左列。没有一种方便的方法来停止/取消选择,因此没有很好的方法来实际管理选择,并在用户提供反馈后将其延迟。我的想法是

  • 实际上不选择用户点击的时间,只是影响地点更改。然后,当onStop()被触发时,实际进行选择。这有点严重,因为我认为取消选择没有方便的方法。或
  • 在用户更改选择后(而不是地点)跟踪最后选择的元素。侦听PlaceChangeEvent,并安排延迟命令以选择该原始项,并侦听PlaceChangeRequestEvent以跳过该命令的主体。这应该有效,因为呈现给用户的警报是阻塞的 - 我实际上没有对它进行过测试。

如果您将地点更改连接到网址,则您需要一个PlaceChangeEvent处理程序来监视用户点击浏览器前进/后退按钮,因此在您决定如何连接时请记住这一点 - 地点更改应该驱动器选择,就像选择需要驱动场所一样,但如果用户点击后退,并取消场所更改,那么小区表应该保留其原始选择。

答案 1 :(得分:0)

我刚刚根据许多来源的输入完成了这个实现。以下是我提出的对我有用的内容。

您需要覆盖单元格窗口小部件中的所有单元格,以便为handleSelection()返回true,如下所示:

/**
 * 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()的场所变更请求事件。这将触发Activity的mayStop()检查。然后你的Activity需要处理这种交互。

就我而言,我有一位单身人士主持人。所以我告诉主持人关于新地方的事。该调用使视图更新以选择相应的行。

此外,我仍然可以使selectionModel正常工作:

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

因此,选择此新行后,将触发另一个事件,以根据新选择更新UI的另一部分。

  • “请勿在用户点击时实际选择”由。处理 自定义单元格覆盖
  • “影响地方更改”部分由CellPreviewHandler和PlaceController.goTo(地方)处理。
  • 其余部分仅由您的活动和地点实施处理。