2010-07-13 35 views
2

我有一些关于GWT(2.1)与MVP和事件有关的问题。使用LayoutPanels GWT中的事件处理

获得了DockLayoutPanel及其中的一些组件。西部有一个Tree组件,中央有一个SimplePanel。每个组件都有一个演示者和一个视图。问题是我想处理其演示者类中的组件事件,但现在它们只能在DockLayoutPanelPresenter的容器中捕获。我想在TreePresenter中处理树的事件。我认为TreePresenter应该处理它的'SelectedItem'事件,并且它可以将它放到事件总线上,以便其他组件可以对它做出反应。

有没有其他人面对过这个?张贴在GWT组列表上,但没有得到回复。我认为这是解耦组件的重要主题。

+0

你能澄清你的设计多一点吗?所以,你有一个TreePresenter,并且你附加了一棵Tree作为它的一个视图。视图部分抛出一个事件,并且你想要在演示者中捕获该事件?当你说它只能在容器中捕获时,你是什么意思? – igorbel 2010-07-13 22:02:33

+0

我在这个线程中打了一个相当广泛的答案,我解释了我在gwt应用程序中如何解决这个问题。也许这可以帮助你? http://stackoverflow.com/questions/2832779/is-there-a-recommended-way-to-use-the-observer-pattern-in-mvp-using-gwt/2832919#2832919 – 2010-11-09 22:08:37

+0

Banang已经给你最好的回答,恕我直言。使用事件总线来使UI代码的不同部分彼此协作,而不必相互了解。事件总线唯一的*潜在*问题是要有一个非常健谈的应用程序,即太多的事件被解雇,太多的处理程序不得不做出响应。一旦你到达那里,就担心这个问题。 – 2011-03-13 19:29:55

回答

0

在这种情况下,在页面的不同区域,每个区域有一个主持人,你可以使用由GWT队的大卫·钱德勒提出的办法:

http://groups.google.com/group/google-web-toolkit/browse_thread/thread/2812e1b15a2a98a6/8c82d629b7a48e56?lnk=gst&q=EastActivityMapper#8c82d629b7a48e56

你应该阅读后,但在总之,你会做这样的事情:

WestActivityMapper westActivityMapper = new WestActivityMapper(); 
WestActivityManager westActivityManager = new WestActivityManager(westActivityMapper, eventBus); 
westActivityManager.setDisplay(westPanel); 

EastActivityMapper EastActivityMapper = new EastActivityMapper(); 
EastActivityManager eastActivityManager = new EastActivityManager(eastActivityMapper, eventBus); 
EastActivityManager.setDisplay(eastPanel); 

dockLayoutPanel.addWest(westWidget, 50); 
dockLayoutPanel.addEast(eastWidget, 50); 
RootLayoutPanel.get().add(dockLayoutPanel); 

西活动映射器将负责显示你的树,东映射器将包含应用程序的身体。

我们正在使用这种方法来显示我们的西方停靠面板(不是树,但足够接近)的项目列表,然后更新显示在我们的应用程序主体中的内容。当用户从列表中选择一个项目时,我们触发一个新的Place事件,并将该列表项目的ID包含在Place Token中,以便用户可以使用后退按钮。但是,您也可以像您指出的那样使用EventBus。