Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT MVP导航侧栏_Gwt - Fatal编程技术网

GWT MVP导航侧栏

GWT MVP导航侧栏,gwt,Gwt,我正在使用GWT编写一个web应用程序,并遵循GWT网站上的说明(即用于导航) 我有点困惑,为什么最好有一个侧栏来导航(即单击导航链接会更改主窗口中的内容。请参见下文) 我看到的一种可能的方法是在HTML中声明两个用于导航和内容的标记。例如: @Override public void onValueChange(ValueChangeEvent<String> event) { ... if (token.equals("navigation")) {

我正在使用GWT编写一个web应用程序,并遵循GWT网站上的说明(即用于导航)

我有点困惑,为什么最好有一个侧栏来导航(即单击导航链接会更改主窗口中的内容。请参见下文)

我看到的一种可能的方法是在HTML中声明两个用于导航和内容的
标记。例如:

@Override
public void onValueChange(ValueChangeEvent<String> event) {

    ...

    if (token.equals("navigation")) {
        presenter = new NavigationPresenter(rpcService, eventBus, new NavigationView());
        presenter.go(RootPanel.get("navigation"));
    }

    ...

    if (token.equals("content")) {
        presenter = new ContentPresenter(rpcService, eventBus, new ContentView());
        presenter.go(RootPanel.get("content"));
    }

    ...
}
@覆盖
ValueChange上的公共作废(ValueChangeEvent事件){
...
if(标记等于(“导航”)){
presenter=new NavigationPresenter(rpcService、eventBus、new NavigationView());
presenter.go(RootPanel.get(“导航”);
}
...
if(令牌等于(“内容”)){
presenter=新的ContentPresenter(rpcService、eventBus、new ContentView());
presenter.go(RootPanel.get(“内容”);
}
...
}
我不确定这是否是最好的方法。(我想导航面板和内容窗口之间的双向通信可以通过
EventBus
?这种方法在更改用户界面(例如移动站点)时是否灵活?)

我想知道人们会建议什么是最好的解决方法。我读过很多关于的文章,并经常讨论这些内容,但据我所知,这些内容与MVP体系结构有些不同(活动和场所对MVP体系结构很有用,尽管我认为我对
历史的使用涵盖了这一点(?)


如果您有任何建议,我们将不胜感激。

是的,您是对的:
活动和地点
是关于历史和导航管理的,这是GWT
中的一个框架
MVP
只是一种架构设计模式。您可以使用您链接的文章中所示的框架实现
MVP

在您的示例中,您可以按您所说的做,但我会将每个视图都设置为(惰性)单例,以避免任何可能代价高昂的重新创建。就我个人而言,我不喜欢这种方式,你最终用(这么多)HasXxx接口来定义你的
显示

我认为,如果历史管理很重要,那么选择
活动和地点
几乎是不费吹灰之力的(至少对我来说,至少是定义应用程序的框架)。你可以找到一篇非常好的文章来开始。您将看到您的用例是多么常见:您必须定义显示区域(导航和主要区域),这些区域将在位置更改时做出反应(感谢活动管理器),并创建/重新启动活动,从而更新UI。通过这种方式,您可以实现某种应用程序范围的MVP,其中演示者就是活动

MVP
而言,没有最好的方法可以做到这一点:,而只是实现相同目标的不同方法:分离表示和业务逻辑,以及纯junit测试。只需选择你喜欢的。请参阅关于组的帖子以获取参考


希望这能让您开始。

对于我的应用程序,我使用的ClientFactory与GWT文档中的一样,使用singleton进行查看

这样,应用程序结构(包括菜单)也是ClientFactory中引用的单例,因此每个其他视图都可以通过其接口直接访问它

例如,某些视图可能会在标题中推送某些图像,隐藏菜单以显示视频,或者您需要的任何内容。大多数情况下,应用程序的结构不需要单独的活动/位置来“保持”其在历史堆栈中的状态

我知道大多数人不喜欢视图之间互相调用,我也是,唯一的例外是应用程序的结构视图,这是一种特定的视图:它有一个不是活动的演示者,并且视图本身是永久显示的


通过通知在应用程序结构和其他视图之间进行通信将使您的应用程序成为意大利面碗。我曾经使用过像PureMVC这样的框架,它们在视图之间的通信非常依赖于事件/通知,而这种分离会带来高昂的成本:可维护性和代码可读性。

首先@Andrea Boscolo肯定是对的:我从我谦逊的大脑可能想到的各个角度研究了历史管理,而Acitivities&Places是实现历史映射而无需重新发明轮子的最佳方式。唯一的缺点是PlaceHistoryMapper@WithTokenizers生成标记的方式:URL是最丑陋的,位置前缀由“:”分隔,然后是参数。我已经实现了“自标记化”位置,它生成的URL像:“www.myapp.com/#/placeprefix/param1=value1¶m2=value2,而不是GWT的标准:www.myapp.com/#placeprefix:anythingelseinthetoken……这可能只是因为我是一个URL狂热者
@Override
public void onValueChange(ValueChangeEvent<String> event) {

    ...

    if (token.equals("navigation")) {
        presenter = new NavigationPresenter(rpcService, eventBus, new NavigationView());
        presenter.go(RootPanel.get("navigation"));
    }

    ...

    if (token.equals("content")) {
        presenter = new ContentPresenter(rpcService, eventBus, new ContentView());
        presenter.go(RootPanel.get("content"));
    }

    ...
}