【问题标题】:Nested Activities and history in gwt activities and placesgwt 活动和地点中的嵌套活动和历史
【发布时间】:2012-09-24 04:42:36
【问题描述】:

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

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

左侧有声明数量,选中后右侧显示条目。

我提出了以下观点。

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

每个视图都有对应的地点和活动。

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

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

我在设计时遇到以下问题:

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

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

【问题讨论】:

  • “标签切换之间必须保持历史”是什么意思?更改标签后,您希望后退按钮做什么?
  • 当我切换标签并按下返回按钮时,它必须将前一个标签显示为活动状态,并且位置标记必须相应更改。

标签: gwt


【解决方案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 的用户对象。然后将初始化标志设置为true。

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

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

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

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

就是这样:两个视图,两个活动。没有嵌套。

【讨论】:

    【解决方案2】:

    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 将处理整个层次结构的历史记录,因此无论嵌套的层级/宽度有多少,历史令牌都将允许重新创建它。

    【讨论】:

      【解决方案3】:

      希望我能给你指明正确的方向。

      1. 有无数种实现逻辑的方法。我建议阅读命令设计模式(谷歌它你会找到好的资源)

      2. 如果您指的是浏览器历史记录,请参阅DevGuide。 如果您的意思是简单地记住用户选择的选项。然后简单地编写你自己的类来记住它,这也可以帮助你 1..

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多