0

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

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

1.实例化数量不定的PresenterWidget

  • 读到这里,看起来我只需要一个提供者。

2.PresenterWidget将我想要的论点转移到每个人身上。

  • ProxyEvent 似乎不是一个选项,因为 PresenterWidget 没有代理
  • 我需要在显示 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 阻止显示内容。任何想法为什么?

4

2 回答 2

1

有不同的方法可以解决这个问题,其中之一就是您在自己的答案中显示的方式。

  1. 在你的身上创建一个二传手PresenterWidget并从你的父母那里设置它Presenter(你是如何做到的)。
  2. 触发并EventEventBus您的PresenterWidgets(事件包含EntryProxy实例)中处理它。
  3. PresenterWidget自己从后端检索数据。

解决方案 3 不适用于您的情况,因为您拥有的数据不是单一的PresenterWidget,而是与您拥有的数据一样多。

解决方案 2 的耦合最小。但是,当您使用PresenterWidgets 时,无论如何您的父母Presenter和您之间都有耦合,PresenterWidget因此没有太多好处。EntityProxy如果您想使用检索到的elswhere (即面包屑PresenterWidget),我只会使用此方法。

如果您只处理EntryProxy那些PresenterWidgets.

于 2013-10-04T08:06:45.437 回答
0

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

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

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

getView().setInSlot(whatever,whatever)

反而

[this.] setInSlot(whatever,whatever)

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

家长主讲人:

@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());
}
于 2013-10-03T10:02:52.037 回答