我有一个GWTP Presenter
,其中我想添加一个未确定数量的GWTP PresenterWidget
实例。对于每个实例,我需要传递父Presenter
拥有的参数(每个实例的不同参数)。
我需要在这里完成两件事:
1。实例化未确定数量的PresenterWidget
2。转移到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来阻止显示内容。有什么想法吗?
答案 0 :(得分:1)
有不同的方法来解决这个问题,其中之一就是你在自己的答案中展示的方式。
PresenterWidget
上创建一个setter,并从您的父Presenter
设置它(您是如何做到的)。 Event
上点击EventBus
并在PresenterWidgets
中处理该事件(该事件包含EntryProxy
个实例)。PresenterWidget
本身从后端检索数据。 解决方案3在您的情况下不起作用,因为您没有一个PresenterWidget
,但只有数据。
解决方案2具有最少的耦合。但是,当您使用PresenterWidget
时,您的父级Presenter
和PresenterWidget
之间仍然存在耦合,因此没有太大的好处。如果您想使用检索到的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());
}