0

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

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,它将显示一个具有与 Gui1 或 Gui2 不同的 Gui3 的对话框。

所以,我的问题是:

有没有办法检索当前演示者?

如果我们知道哪个 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 个超链接。

-4,我在 HeaderPresenter 中创建 GuideDialog.java extends 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 个复选框)

4

3 回答 3

0

考虑我们有这样的事情:

一般观点

// 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,MVC 的变体)架构,这是向您展示 MVP 架构如何工作的极好信息。

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

于 2013-10-25T14:47:46.783 回答
0

我找到了答案,很简单。

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

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

GuideDialogBox gDialogBox=new GuideDialogBox(placeManager.getCurrentPlaceRequest().getParameter("whichLink", "home"));
于 2013-10-25T17:46:45.357 回答
0

我不明白你的问题:

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

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

例如 :

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

...

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

于 2013-10-25T16:20:14.293 回答