1

我有一个设计如下的应用程序。这是一个旅行索赔报销应用程序。它有两个选项卡:

  1. 我的索赔:显示迄今为止提出的所有报销索赔
  2. 我的帐户:显示我的详细信息

它在左侧和选定时具有索赔数量,将显示右侧的条目。

我提出以下意见。

  • AppView:对于具有标签面板和标签的整个应用程序
  • MyAccountsView: MyAccount 标签下的内容。
  • MyClaims View: 对于 Myclaims 标签下的内容。这有两个面板。左边的那个加载了索赔。在选择要查看的声明之前,该权限为空。
  • SelectedClaimView:右侧面板显示所选索赔的索赔条目。

每个视图都有相应的位置和活动。

这些是我在创建应用程序时遇到困难的以下要求:

当我单击左侧面板上的声明时,右侧面板必须在 selectedClaimView 中显示声明条目。当我单击另一个声明时,列表必须由该声明的内容填充。我还想要此声明选择的历史支持。

我在设计时面临以下问题:

  1. 如何添加嵌套活动。例如,当我选择 MyClaimsTab 时,所有声明都必须加载到左侧面板中。在选择索赔时,索赔条目必须通过选定的索赔视图加载到右侧面板中。但是,调用活动并更改位置会停止调用活动。

  2. 此外,两个选项卡中的两个活动都必须同时运行,并且必须在选项卡切换之间维护历史记录。这是我不知道该怎么做的事情,并希望得到建议。

4

3 回答 3

1

您的要求非常简单,您的设计也应该如此。您只需要两个活动和两个视图:AccountView 和 ClaimsView。

您需要一个简单的小部件 - 一个带有两个标签样式为选项卡的 FlowPanel - 作为您的导航菜单。您将此小部件放在两个视图的顶部,并将 ClickHandler 附加到与另一个视图相对应的标签上 - 即在 AccountView 中将处理程序附加到 Claims 标签,这会触发 presenter.goTo(new ClaimsTab(""). Claims label应该在 ClaimsView 中设置为按下的选项卡,在 AccountView 中设置 Account 标签。这将负责导航:不需要特殊活动。

AccountView 很简单:顶部的导航小部件,下面的详细信息。对于 ClaimsView 使用分为三层的 LayoutPanel:顶层用于导航小部件,左侧层用于声明,右侧层用于详细信息。假设您将 Tree 用于索赔,并使用封装在 ScrollPanel 中的 FlowPanel(“claimDetailsPanel”)用于索赔详细信息。

您的 ClaimsView 应该有一个“已初始化”标志(带有 getter 和 setter)。当用户来到 ClaimsTab 位置时,您将启动 ClaimsActivity。此活动获取对 ClaimsView 的引用。它检查 ClaimsView 是否已初始化。如果没有,它会加载声明列表并填充声明树。构建树时,将每个声明设置为每个 TreeItem 的用户对象。然后将初始化标志设置为真。

您将选择处理程序附加到调用 presenter.goTo(new ClaimsTab(selectedClaim.getId().toString())); 的树上。

这会将用户发送回同一选项卡,但使用新的 URL 令牌 - 如果所选声明的 id=123,您将看到 #ClaimsTab:123 令牌。屏幕上不会有闪烁,因为 ClaimsView 已经构建并且仍然可见。

现在您将运行一个新的 ClaimsActivity。此活动注意到 (a) 有一个需要处理的令牌,以及 (b) 不需要加载声明并填充声明树,因为视图已初始化。您的活动应该解析令牌(将其转换为声明 ID),加载此声明的详细信息,并将此信息提供给 ClaimsView 以填充 claimDetailsPanel(您应该首先清除它,因为它可以包含先前声明的内容)。

一个小细节。用户可以为任何声明添加书签。因此,如果您的 ClaimsActivity 构建声明树,它应该检查令牌。带有书签的页面将有一个标记,因此活动应该告诉视图要选择哪个树项。

就是这样:两种观点,两种活动。没有嵌套。

于 2012-09-24T13:57:22.680 回答
0

Slotted框架使您可以轻松地做到这一点。(免责声明:我写了Slotted)。让我描述一个简单的方法来做你想要的。您像这样定义您的主要 AppPlace:

public class AppPlace extends SlottedPlace {
    public static final Slot TabsSlot = new Slot(new AppPlace(), new MyClaimsPlace());

    @Override public Slot getParentSlot() {
        return SlottedController.RootSlot;
    }

    @Override public Slot[] getChildSlots() {
        return new Slot[] {TabsSlot};
    }
}

这告诉 Slotted 框架,您的 AppPlace 有一个 Slot,它可以在当前 View 中包含另一个 Activity。

在 AppActivity 中,您需要扩展 SlottedPlace 并覆盖此方法:

@Override public void setChildSlotDisplay(Slot slot) {
    slot.setDisplay(tabsSlotWidget);
}

tabsSlotWidget 将是一个 SimplePanel 或 SimpleLayoutPanel,将用作新活动的容器。AppPlace 中可以有两个插槽,MyClaimsPlace 中也可以有插槽。有一个 SlottedTab 小部件,它提供与 TabPanel 类似的功能,但允许每个选项卡成为一个 Activity。

除了上述更改之外,活动的工作方式与 GWT A&P 相同。您还可以在 Slotted 中运行现有的 A&P 站点,并且只升级需要嵌套的活动。

  1. 这允许同时启动多个活动,这是普通 GWT A&P 所不允许的。如果您调用位于 Activity 中的同一级别的 Place,它只会替换该 Activity,并且仍然保留层次结构的其余部分。

  2. Slotted 将处理整个层次结构的历史,因此无论嵌套的级别/宽度有多少,历史令牌都将允许重新创建它。

于 2013-02-27T05:50:54.160 回答
-1

I hope I can point you in the right direction.

  1. There are an endless amount of ways of implementing logic. I would recommend reading up on the command design pattern (google it you will find good resources)

  2. If you mean history by browser history see DevGuide. If you mean simply remember what the user chose options. Then simple write your own class which remembers it, this might also help you with 1..

于 2012-09-24T10:26:36.477 回答