对于过去几个月,我一直在开发一个GWT应用程序使用的是混合纯醇'的GWT 和GXT 部件。当我第一次开始开发它,我不知道如何以最佳方式组织我的代码和单独的逻辑。该解决方案,我又是通过一些MVC框架排序。既然我已经使用GXT,我选择了GXT的轻量级MVC实现 。
正如提到的GWT应用测试 外,GXT的MVC 没有那么多的文档 。最好的参考文件似乎是基督徒的GWT - Ext的入门:邮件参考应用 。
佩奇的过渡与调度
经过与GXT MVC的工作了几个月,我真不知道我完全明白如何导航和事件调度工作。我最大的一点混乱的,是如何以最佳方式使用GXT的调度 类。
与调度的问题是它有两种方法,似乎做同样的事情。
forwardEvent
(4变化) dispatch
(3变化) 除了这些方法在调度员,有2 fireEvent
的方法GXT 视图 类。根据我的计算,这意味着有一种意见认为从9过渡到下一个不同的选择。哪一个是最好用?
从我所学到的,我认为这是最好使用fireEvent
的意见和forwardEvent
在控制器和其它部件。海事组织, dispatcher
应该永远不会被执行,除非你使用HistoryListener的onHistoryChanged
方法。重要的是要实现这个方法是应该 只工作,如果在视图的控制器是事件注册的。
保护无效fireEvent(AppEvent事件)( 控制器? =控制器; 而(三!=空)( 如果(c.canHandle(事件))( c.handleEvent(事件); ) ? = c.parent; ) )
然而, fireEvent
似乎工作,即使在视图的控制器是不注册该事件。这是因为onHistoryChanged
得到入口点调用的。对于有经验的GXT MVC的用户,这是否与您的导航处理结果网?
在导航最重要的工作是成功地使历史的支持。如何有效地完成这项下一节会谈。
启用历史支持
为了更好地帮助解释的事情,我创建了一个简单的GWT的MVC示例应用程序和使用Maven来创建一个与它的原型。您可以创建一个从原型项目使用以下命令:
命令mvn原型:创建,DarchetypeGroupId = org.appfuse.archetypes \ - DarchetypeArtifactId =的GWT的MVC - DarchetypeVersion = 1.0 - SNAPSHOT的\ - DgroupId = com.mycompany.app - DartifactId = myproject \ - DremoteRepositories = http://oss.sonatype.org/content/repositories/appfuse-snapshots
为了让历史在此应用程序支持,我实现了HistoryListener 在我的入口点(Application.java)并添加下面的逻辑来初始化:
/ /如果在应用程序启动,没有历史的象征,重定向到'家'的状态 弦乐initToken = History.getToken(); 如果(initToken.length()== 0)( History.newItem(HistoryTokens.HOME); ) / /添加监听器的历史 History.addHistoryListener(本); / /现在我们已经设置的侦听器,火灾初期的历史状态。 History.fireCurrentHistoryState();
在这个例子中,HistoryTokens是一个类,包含了所有的“意见申请”的网址。
公共类HistoryTokens( 公共静态最后弦乐首页=“家”; 公共静态最后弦乐日历=“日历”; 最后附注公共静态字符串=“笔记”; 公共静态最后字符串搜索=“搜索”; )
为了使像http://localhost:8080/#网址查看日历到日历,下面的逻辑存在于onHistoryChanged
方法。
调度调度= Dispatcher.get(); 如果(historyToken!=空)( 如果(historyToken.equals(HistoryTokens.HOME))( dispatcher.dispatch(AppEvents.GoHome); )否则如果(historyToken.equals(HistoryTokens.CALENDAR))( dispatcher.dispatch(AppEvents.Calendar); )否则如果(historyToken.equals(HistoryTokens.NOTES))( dispatcher.dispatch(AppEvents.Notes); )否则如果(historyToken.equals(HistoryTokens.SEARCH))( dispatcher.dispatch(AppEvents.Search); 否则)( GWT.log(“HistoryToken'”+ historyToken +“'不存在!”,空); ) )
对于EntryPoint控制器是在注册如下:
最后调度调度= Dispatcher.get(); dispatcher.addController(新CalendarController()); dispatcher.addController(新HomeController的()); dispatcher.addController(新NotesController()); dispatcher.addController(新SearchController());
控制器回应他们注册的事件。这是在他们的构造函数:
公共CalendarController()( registerEventTypes(AppEvents.Calendar); )
在航行秩序的工作,你必须创建1个 链接历史标记。例如,这里是一个链接,从HomeView
类:
超链接notesLink =新的超链接(“票据”,HistoryTokens.NOTES); notesLink.addClickListener(新ClickListener()( 公共无效的onClick(小工具小工具)( Dispatcher.get()。fireEvent(AppEvents.Notes); ) ));
你会注意到在这个例子中,我使用Dispatcher的fireEvent
方法。如果我想通过您的活动的一些数据,您将需要使用forwardEvent
。下面是一个从例子CalendarView
:
按钮提交=新的按钮(“提交”); submit.addSelectionListener(新SelectionListener <ButtonEvent>()( 公共无效componentSelected(ButtonEvent CE认证)( AppEvent <日期> =事件 新AppEvent <日期(AppEvents.GoHome,date.getValue(),HistoryTokens.HOME); Dispatcher.forwardEvent(事件); ) ));
在这个例子中,你也可以使用Dispatcher.dispatcher()
但我相信,这将导致发生两次转变,因为onHistoryChanged
方法被调用了。这并不是问题的大部分,除了当您开始使用DispatcherListener 第
希望这篇文章已经帮助您了解如何GXT的MVC框架工程。我现在在学习如何其他GWT的MVC框架的工作感兴趣。如果您使用过的,我很乐意听到你的经验。
1。如果您使用默认的构造和使用上的超链接setText()
请务必致电setTargetHistoryToken()
了。如果你不这样做,一个空白的历史将被用来标记和#导致浏览器出现滚动页面过渡前的顶部。
本文摘自:http://java.dzone.com/articles/gxts-mvc-framework