将参数传递给GWTP中的多个PresenterWidget

时间:2013-10-03 00:42:42

标签: gwt gwtp

我有一个GWTP Presenter,其中我想添加一个未确定数量的GWTP PresenterWidget实例。对于每个实例,我需要传递父Presenter拥有的参数(每个实例的不同参数)。

我需要在这里完成两件事:

1。实例化未确定数量的PresenterWidget

  • 阅读here,看起来我只需要一个提供商。

2。转移到PresenterWidget我想要的每个参数。

  • 由于PresenterWidget没有代理
  • ,因此ProxyEvent似乎不是一个选项
  • 我需要在显示PresenterWidget
  • 之前传递参数
  • 在PresenterWidget上声明一个公共方法并从父级演示者访问它是否可能或者是一个好习惯?

例如:

public class MyWidgetPresenter extends PresenterWidget<MyWidgetPresenter.MyView>  {

...
    private MyArgument argument;
        public void setArgument(MyArgument argument){
        this.argument=argument;
    }

然后家长主持人可以:

@Inject Provider<MyWidgetPresenter> myWidgetPresenterProvider;
...

[this could be part of a loop]
MyWidgetPresenter myWidgetPresenter = myWidgetPresenterProvider.get();
myWidgetPresenter.setArgument(argument);
getView().addToSlot(SLOT_MyWidgetPresenters, myWidgetPresenter);
[loop end]

这是一个有效的解决方案吗?我已经实现了它,一切正常,只是我的PresenterWidget从不调用onReveal或onReset来阻止显示内容。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

有不同的方法来解决这个问题,其中之一就是你在自己的答案中展示的方式。

  1. PresenterWidget上创建一个setter,并从您的父Presenter设置它(您是如何做到的)。
  2. Event上点击EventBus并在PresenterWidgets中处理该事件(该事件包含EntryProxy个实例)。
  3. PresenterWidget本身从后端检索数据。
  4. 解决方案3在您的情况下不起作用,因为您没有一个PresenterWidget,但只有数据。

    解决方案2具有最少的耦合。但是,当您使用PresenterWidget时,您的父级PresenterPresenterWidget之间仍然存在耦合,因此没有太大的好处。如果您想使用检索到的EntityProxy elswhere(即breadcrumb PresenterWidget),我只会使用此方法。

    如果你只处理那些EntryProxy中的PresenterWidget,解决方案1(你建议的那个)就可以了。

答案 1 :(得分:0)

我正在回答这个问题,因为我发现了问题所在。我仍然不知道我在做什么被认为是一种好习惯。 [见Ümit的回答]

我的WidgetPresenter没有调用onReveal()或onReset()的原因是因为我调用了视图的setInSlot而不是Presenter。这可能是一个容易犯的错误。

在演示者身上永远不要这样做:

getView().setInSlot(whatever,whatever)

而是

[this.] setInSlot(whatever,whatever)

这是我的代码,为了完整起见:

家长Presenter:

@Override
    public void onReset(){
        super.onReset();

        /* Request the Topic graph to show using RequestFactory*/
        TopicService service = requestFactory.topicService();
        service.getTopicGraph(movieId).with("entries").fire(new Receiver<TopicProxy>(){

            @Override
            public void onSuccess(TopicProxy response) {
                /* Clear whatever was in the slot before */
                getView().setInSlot(null, null);
                /* Get the Topic and set the title in this Presenter*/
                topic = response;
                getView().setMovieTitle(topic.getName());

                /* Then:
                 * - retrieve the Entries and add them to as many PresenterWidgets as needed
                 * - add those widgets to an slot on this Presenter
                 * - set on the PresenterWidget the Entry, that call also set's the child's view*/
                Iterator<EntryProxy> it = topic.getEntries().iterator();
                while(it.hasNext()){
                    //TODO: pagination
                    ReviewPresenter myRP = myReviewPresenterProvider.get();
                    myRP.setEntry(it.next());
                    setInSlot(SLOT_movie, myRP);
                    reviewPresenterList.add(myRP);
                }
            }

            @Override
            public void onFailure(ServerFailure error){
                getView().setMovieTitle(error.getMessage());
                //TODO use a label or go to error Place
            }

        });;

PresenterWidget上的setEntry方法:

public void setEntry(EntryProxy entry){
    this.entry = entry;
    getView().setTextArea(entry.getText());
}