如何在GWT中的复合窗口小部件中设置Presenter

时间:2011-12-20 18:32:48

标签: gwt mvp presenter

我有一个使用MVP,clientFactory,活动,地点和uiBinder的GWT 2.4应用程序。我有一个复合小部件,我使用它自己的ui.xml文件作为独立对象创建。我引用该类并将其插入到主viewImpl.ui.xml文件中。

组合小部件从后端接收一些数据,我需要将其返回到活动,以便它可以显示在表格中。我正在使用与视图关联的演示者来进行活动。这是代码: 在View界面中:

public interface NameView extends IsWidget
{
    void setPresenter(Presenter presenter);
...    

public interface Presenter{
            void goTo(Place place);
            void setRowDataList(List<Data> rowData);
        }

在我的Activity中,我实现了View.Presenter,如下所示:

 Activity extends AbstractActivity implements NameView.Presenter

所以活动是我需要的演示者,我需要在我的独立小部件和我使用的活动的start方法中:

NameView  nameView = clientFactory.getNameView();//NameView is just an example.
nameView.setPresenter(this); ...

设置演示者并实例化它。我的问题是,在小部件中我需要这个:

presenter.setRowDataList(rowData);

但我不确定如何从小部件中引用实例化的Presenter?

这个独立的小部件,实际上是一个gwtUpload小部件,是独立的。我对上传的一些数据进行服务器端计算,然后返回到此小部件。

小部件数据需要返回到Activity才能将该数据传递回NameViewImpl类。

我认为演示者是正确的方法,但由于小部件没有连接到视图或viewImpl,我需要一种方法来获取小部件的演示者。

我知道GIN会用DI来做,或者我可能会创建另一个演示者。我从来没有用GWT设置GIN。有关正确方法的任何想法吗?

工作实施:

我不知道这是否是最好的实现,但基于Thomas的答案,我在ViewImpl类的setPresenter()方法中使用presenter(activity)的实例设置我的小部件。它作为窗口小部件的传递返回到活动。我认为这就是托马斯作为回调界面的意思。

2 个答案:

答案 0 :(得分:1)

如果我理解你,你有一组对象活动,presenter和ui(NameView)和另外一个与这三个分开的对象。分隔的对象是gwtUpload小部件。

通知演示者的一种方法是使用eventBus。我相信你在活动中有参考。对于gwtUpload我不知道“独立”对象到底是什么意思,您必须与其他演示者建立某种联系才能到达eventBus

gwtUpload小部件将使用服务器端计算的结果在eventBus中触发事件(通过它自己的演示者)。请记住,最好只发送模型对象作为结果。该活动将在eventBus上为该事件“注册”处理程序。在处理程序中,您可以将数据发送到视图以更新表格显示。

我认为你不需要GIN来解决这个问题,因为这里的任何案例都是很好的教程: http://code.google.com/p/google-gin/wiki/GinTutorial

答案 1 :(得分:1)

我们在类似情况下所做的是为窗口小部件定义一个回调接口(类似于presenter-view对中的presenter接口),然后我们通常会让presenter接口扩展该窗口小部件特定的接口。
然后,当我们在视图上调用setPresenter(或其所谓的任何内容)时,要关联演示者,视图会立即使用相同的值调用窗口小部件上的setCallback(演示者实现回调接口)。

另一种设计是在演示者界面的方法后面隐藏特定于窗口小部件的回调。让视图实现回调,实现该方法,使其路由到演示者的等效方法。

顺便说一句,GIN在这里没有帮助。

相关问题