【问题标题】:Ratio of GWT Places to Activities to Screen?GWT 地点与活动屏幕的比率?
【发布时间】:2012-11-10 17:45:18
【问题描述】:

我正在尝试编写一个 GWT 应用程序,它为每个“页面”(位置)重用相同的模板。该应用程序有 4 个主要“页面”:

  • 仪表板页面 (http://www.mywebapp.com/#dashboard)
  • 计算器页面 (http://www.mywebapp.com/#calc)
  • 配置器页面 (http://www.mywebapp.com/#config)
  • 登录页面 (http://www.mywebapp.com/#login)

每个“页面”都具有相同的模板外观:(1) 包含徽标和导航菜单的标题部分,(2) 包含“页面”特定内容的内容部分(即#dashboard 地点、#login 地点等不同),以及 (3) 包含一些链接的页脚部分。所以你看,从页面到页面的唯一变化是内容部分。就像一个普通的模板网站。

问题是,每个“页面”(位置)实际上是一个相当复杂的 UI,其中包含许多不同的面板,其中包含许多小部件。当用户与应用程序交互时,这些面板会出现和消失,并且显示会一直在变化。例如,在#calc 页面上,用户可以选择显示计算器的“模式”:BasicAdvanced。当用户选择高级时,会显示几个附加面板(除了基本面板)。

如果能够将此类操作保留在历史记录中会很不错,这样用户就可以在 BasicAdvanced 模式下为应用添加书签,例如:

  • http://www.mywebapp.com/#calc/basic;或
  • http://www.mywebapp.com/#calc/advanced

问题出在这里:

我们已经在这里进行了几个“级别”的活动/地点。在“app”级别,我们有当MyWebAppModule implements EntryPoint 下载时需要向用户显示的模板。这个TemplatePlace 是在调用之前向 HistoryHandler 注册的默认/初始位置:

public class MyWebAppModule implements EntryPoint {
    @Override
    public void onModuleLoad() {
        // ...

        // The first place we go to when this module downloads.
        TemplatePlace templatePlace = getSomehow();

        historyHandler.register(placeController, eventBus, templatePlace);
        historyHandler.handleCurrentHistory();
    }
}

接下来,我们有所有不同的“页面”:DashboardPlaceCalculatorPlace 等,它们都有自己独特的视图/显示。例如,当用户单击 Calculator 链接转到 CalculatorPlace 时,它应该呈现与他们想要在基本或高级模式下使用计算器时不同的视图。

最后,我们在每个页面/位置内都有不同的显示区域、面板等,例如BasicCalculatorPlaceAdvancedCalculatorPlace。这就是我所说的不同“级别”导航的意思:

  1. 应用级(适用于所有页面/位置的模板)
  2. 页面级或地点级
  3. 显示或面板级

问题:

当用户执行以下所有操作时,我想实现可收藏的 URL(地点):

  • 转到主页 (http://www.mywebapp.com)
  • 转到任何“页面”(http://www.mywebapp.com/#calc 等)
  • 使用导致特定页面面板或显示配置的页面/位置(http://www.mywebapp.com\#calc\#advanced 等)

我要创建多少个活动和地点?有多少个 ActivityManager? 我想我是在询问每个“级别”的可书签 UI 的活动/地点需要多细。提前致谢!

【问题讨论】:

    标签: java gwt gwt-places gwt-activities


    【解决方案1】:

    我认为每个“页面”只需要一个 ActivityManager 和一个 Activity。您可以将“页眉”和“页脚”制作成可以在每个页面中重复使用的小部件。

    您可以使用标记为同一页面的不同状态添加书签。例如,您可以将标记设置为“基本” - 它会告诉 CalculatorActivity 显示基本计算器面板。 URL 如下所示:

    www.myApp.com/?#Calculator:basic
    

    当用户单击小部件以选择高级选项时,您会这样做

    PlaceController.goTo(new CalculatorPlace("advanced"));
    

    CalculatorActivity 将获得 CalculatorView(已显示),它将看到令牌设置为“高级”,并指示此视图显示高级面板。

    请注意,您可以根据需要使您的令牌尽可能详细,然后在 Activity 中解析它们。例如,你可以有类似的东西

    www.myApp.com/?#Calculator:option=basic&position=top&theme=pink
    

    【讨论】:

    • 感谢@Andrei Volgin (+1) - 如何在我的 PlaceHistoryMapper, like your example of: option=basic&position-top&theme=pink 中实现更复杂的令牌?它真的像 if(place instanceof CalculatorPlace) return "option=basic&position=top&theme=pink"; 一样简单还是更复杂?再次感谢!
    • 另外,为了澄清:每页1个Place子类和每页1个ActivityManager,但是有多少ActivityMappers? ActivityManagers 和他们的ActivityMappers 之间是否应该始终保持 1 比 1 的比例,或者您可以将相同的 ActivityMapper 传递给多个经理吗?我认为这是我对“粒度”感到困惑的核心。
    • 整个应用程序只需要一个 ActivityMapper 和一个 ActivityManager - 而不是每个页面。这篇文章解释得很好:developers.google.com/web-toolkit/doc/latest/…。也看一些例子:code.google.com/p/gwt-examples/wiki/DemoActivitiesAndPlaces
    • 但是如果你的应用只有1个ActivityManager,这意味着它的setDisplay(AcceptsOneWidget)一次只能容纳一个小部件,你如何在同一个屏幕上有多个可以独立更新的dislpay区域彼此的?
    • 如果您想使用多个区域,请阅读 Thomas 的精彩帖子:tbroyer.posterous.com/gwt-21-activities-nesting-yagni 但是,如果您只需要一个菜单​​和页脚,您可以将它们制作成小部件并简单地包含在每个小部件中您需要它们的页面。例如,您传递给 AcceptsOneWidget 的主要小部件可以是 LayoutPanel(或 DockLayoutPanel)。菜单小部件将占据顶部,页脚小部件占据底部,然后在中间添加特定于页面的面板。在多个页面上包含相同的小部件不会增加您的代码大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2014-07-16
    • 1970-01-01
    相关资源
    最近更新 更多