【问题标题】:How to retrieve the Current Presenter in GWT or GWTP?如何在 GWT 或 GWTP 中检索当前演示者?
【发布时间】:2013-11-04 13:14:54
【问题描述】:

这是我的问题。我的标题演示器中有很多链接。

Link1 - Link2 - Link3 - GuideDialogLink

当用户点击 Link1 或 Link2 或 Link3 时,会打开一个新的浏览器。

但是,当用户点击 GuideDialogLink 时,它会在当前链接的顶部弹出一个对话框。

GuideDialog 的设计方式是根据用户停留的链接显示不同的 Gui。它的代码是这样的:

 class GuideDialog extends DialogBox{
    public GuideDialog(int whichLink){
       if(whichLink==0){
           //show Gui 1 
       }
       else if(whichLink==2){
           //show Gui 2 
       }
       else if(whichLink==3){
           //show Gui 3 
       }
    }
 }

例如,当用户停留在 Link3 并且如果他们点击 GuideDialogLink 时,如果用户停留在 Link1 或 Link2,它将显示一个具有 Gui3 的对话框,与 Gui1 或 Gui2 不同。

所以,我的问题是:

有没有办法找回当前的 Presenter?

如果我们知道哪个 Presenter 是当前的,那么我们可以相应地调用 GuideDialog 例如:GuideDialog myGD=new GuideDialog(0);

-其他解决方案是将public static int currentLink 存储在Utility 类中。当用户点击链接 1 或链接 2 或链接 3 时,我们可以使用 EventBus 设置 public static currentLink 以进行相应的设置并最终设置为 GuideDialog myGD=new GuideDialog(Utility.currentLink);

但我不认为这个解决方案很优雅,因为谷歌必须有一些功能让我们知道我们在哪个当前页面。

那么我该如何优雅地解决我的问题呢?

编辑

好的,让我澄清一下。我正在使用 GWTP 创建我的 web 应用程序。

-1st,我使用eclipse生成HeaderPresenter。 Eclipse 将创建(HeaderPresenter.java、HeaderView.java 和 HeaderView.ui.xml)。 HeaderPresenter 有 4 个超链接:link1、link2、link3、GuideDialogLink。

-2nd,我创建了 Link1Presenter(Link1Presenter.java、Link1View.java、Link1View.ui.xml)。然后我创建了 Link2Presenter(Link2Presenter.java、Link2View.java、Link2View.ui.xml)。然后我创建了 Link3Presenter (Link3Presenter.java, Link3View.java, Link3View.ui.xml)

-3rd,我使用setInSlot 使 Link1Presenter、Link2Presenter、Link3Presenter 嵌入或嵌套在 HeaderPresenter 中。这意味着当用户转到链接 1(例如:abc.com#link1)时,他们将看到 4 个超链接(链接 1、链接 2、链接 3、GuideDialogLink)。如果他们转到链接 2(例如:abc.com#link2)或链接 3,他们还会看到 4 个超链接。

-4th,我在 HeaderPresenter 中创建 GuideDialog.java 扩展 DialogBox &,我有 guideDialogLink.addClickHandler(new ClickHandler(){ GuideDialog myGD=new GuideDialog (int whichLink); });

所以当用户在链接 1、2 或 3 中时,他们会看到 GuideDialogLink 对吗? & 当他们点击 GuideDialog 时会弹出一个对话框,对吗?

现在我的要求是,当用户在 Link1 中并且如果他们单击 GuideDialogLink 时,将弹出一个对话框并显示一个 Gui(上面有 2 个文本框)。当用户在 Link2 中并且如果他们单击 GuideDialogLink,将弹出一个对话框并显示另一个 Gui(上面有 2 个标签)。当用户在 Link3 中并且如果他们单击 GuideDialogLink,将弹出一个对话框并显示另一个不同的 Gui(上面有 2 个复选框)

【问题讨论】:

  • 如果我错了,请纠正我,你想要的是将鼠标悬停在一个链接上,然后单击显示对话框按钮,对话框将显示与对应的演示者关联的视图,对吗?
  • 不,当用户点击 GuideDialogLink 时,会弹出一个对话框,它不会打开新的浏览器。所以假设你在link1(my.com/link1)中并且你点击GuideDialogLink,那么你仍然在my.com/link1中&对话框将显示Gui1(比如1个按钮和2个文本框)。好的,现在你在 my.com/link2 中,你点击 GuideDialogLink,然后你还在 my.com/link2 中,对话框将显示 Gui2(可能有 4 个单选按钮 + 2 个标签)
  • 所以,场景如下:我们有 3 个视图,每个视图都与对应的演示者相关联。然后我们得到:Link1-View1-Presenter1,依此类推。然后,如果您停留在 Link1 视图中,然后单击 GuideDialogLink,您将显示 Presenter1 检索到的一些 GUI。对吗?
  • 感谢您提出的问题,是的,几乎是正确的,但是 Gui 可以是 Presenter1 的任何东西,但不是必需的,但 Gui 是基于 Presenter1 的。例如,Presenter 1 是关于产品的,那么 Gui 是产品的指南。如果 Presenter2 是关于 Service 的,那么 DialogBox 的 Gui 可以是 Service Guideline。

标签: gwt gwtp


【解决方案1】:

假设我们有这样的东西:

一般观点

// defines what you can access from a View
interface GeneralDisplay extends Display {
}

// implements a View
class abstract GeneralView implements GeneralDisplay {

    // **Edit**: here you code the corresponding GUI
    public abstract Composite getDialogGUI();
}

链接特定视图

// additional, if you need specific behavior in your linkX view
interface LinkDisplay1 extends GeneralDisplay {
}

// if all views are the same there's no need to implement LinkDisplayX
class LinkView1 extends GeneralView implements LinkDisplay1 {

    @Override
    public Composite getDialogGUI () {
        // **Edit** here you code the DialogGUI
    }
}

// other LinkViews ...

演讲者

// a more generic presenter for all Links
class GeneralPresenter<D extends GeneralDisplay> extends DefaultPresenter<D> {
    // some code here ...

    // constructor, here you associate the corresponding display
    public GeneralPresenter (D display, EventBus eventBus, DispatchAsync dispatch) {
        super(display,eventBus,dispatch);  
        // some code here ...
    }

    public void onBind () {
        registerHandler(display.getDialogBoxLink().addClickHandler ( new ClickHandler () {
             doShowDialogGUI();
        }));
    }

    public void doShowDialogGUI () {
        // here you show the dialog box, you can access the corresponding view by:          
        // this.display
        // **Edit** add some code here
        display.getDialogBox().setWidget(display.getDialogGUI());

    }

}

// Then you have the follogiwng
class LinkPresenter1<D extends GeneralDisplay> extends GeneralPresenter<D> {
    // some code here ...

    @Override 
    public void onBind () {
        super.onBind(); // here is where the "real stuff" is binded
    }
}

有关更多信息,您可以阅读GWT-MVP (Model-View-Presenter, a variant from MVC) architecture,这是向您展示 MVP 架构如何工作的绝佳信息。

*编辑:*我添加了一些额外的代码来检索相应的 DialogGUIs 视图。

【讨论】:

  • 我正在使用 GWTP 和 eclipse,所以当我创建演示者时,eclipse 会为我创建所有必要的类。例如,在创建 HeaderPresenter 时,会创建 HeaderPresenter.java、HeaderView.java 和 HeaderView.ui.xml。创建 Link1Presenter 时,它将创建 Link1Presenter.java、Link1View.jav、Link1View.ui.xml
  • 哦,好的,所以您已经了解了有关 MVP 模式的所有必要结构。但是,我认为您必须添加一个额外的抽象层,因为您需要对链接执行通用单击并返回相应的 DialogView。这就是我添加额外的 GenericDisplay、View 和 Presenter 的原因。
【解决方案2】:

我不明白你的问题:

当您单击链接时,您的位置会发生变化(PlaceTokenizer、控制器等...)。所以信息在 PlaceController(当前位置 url)中。

您可以从那里获取信息。如果你有一个 ClientFactory,你可以从中获取 PlaceController 并询问哪个是当前 Place 对象。

例如:

public P getCurrentPlace() {
    return (P) commonClientFactory.getPlaceController().getWhere();
}

...

注意: 该信息也在 ActivityManager 中(我不建议在您的情况下使用它,因为您对更大的范围(地点)感兴趣,而不是:当前的 Activity )

【讨论】:

  • 好的,我有一个 headerpresenter,它有 link1、2、3 和 GuideDialogLink。当用户单击 link1 时,它将打开 Link1Presenter (my.com/#!link1) 并且当用户在 link1 中时,他们仍然会看到 4 个链接,因为 link1 嵌套在 headerpresenter 中,并且当用户单击时在 link1 上 GuideDialogLink ,然后是一个对话框会弹出。当他们在 link2 中时,他们还会看到 4 个链接,因为链接嵌套在 HeaderPresenter 中,当用户单击 GuideDialogBo 时,会弹出一个对话框,但这次对话框上的 Gui 与用户在 link1 中时不同
  • 好的,所以您需要根据所选链接(例如 my.com/#!link1 或 my.com/#!link3)打开弹出窗口。所以你只需要获取当前的 Place 对象,并读取当前选中的是哪个链接。如果您的问题只是保持弹出窗口打开,您可以在活动中添加一个布尔值,表示弹出窗口是否打开。如果为真,请立即打开显示的弹出窗口(如果 ActivityMapper 返回相同的活动,这需要 ActivityManager 中的一个小技巧,它会跳过 Activity.start())无论如何,我建议你根据 url 完成所有工作,否则 prblm在 url 上复制粘贴
  • 所以概括一下:1-向您的演示者(活动)添加一个布尔值以了解弹出窗口是否打开(最终将其添加到该位置) 2-破解 ActivityManager 以便它调用 start() 或添加如果映射器返回的 Activity 相同,则使用方法 refresh() 3- 检查 boolean + url 并决定对话框内容和状态
  • 在我的 HeaderPresenter 中,我有 myGuideLink.addClickHandler(new ClickHandler(){ GuideDialog gD=new GuideDialog });那么当我们打开 DialogBox 时,我们如何知道当前存在哪个链接。我认为它应该有一个更简单的解决方案。
  • 我明白了,很简单,只需使用 placeManager 即可,它可以做神奇的事情,请参阅我的回答。无论如何谢谢你,因为你的回答帮助我找到正确的解决方案
【解决方案3】:

我找到了答案,很简单。

1st,当打开一个新链接时,我们可以添加一个参数,比如 whichLink。前my.com#link1;whichLink=link1

然后在HeaderPresenter中,调用GuideDialog的时候,我们这样做

GuideDialogBox gDialogBox=new GuideDialogBox(placeManager.getCurrentPlaceRequest().getParameter("whichLink", "home"));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多