В среде MVP создание элементов пользовательского интерфейса и перехват событий должны происходить в представлении, а затем представление должно обрабатывать эти события и вызывать презентатора для принятия соответствующих действий, например:
public void setCrumb(ArrayList<Crumb> crumbs) {
content.clear();
for (int i=0;i<crumbs.size()-1; i++){
Anchor anchor = new Anchor(crumbs.get(i).getText());
anchor.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
presenter.doSomethingAboutAnchorClicks(...);
}
});
content.add(anchor);
content.add(new InlineHTML(" > "));
}
content.add(crumbs.get(crumbs.size()-1).getText());
}
А в Presenter вы хотите иметь метод handleEvent(Event event)
, который может использовать события, и метод, который вызывает View для setCrumb(crumbs)
.Мне кажется, что вы смотрите на MVP так же, как MVC.Разница в том, что обработка событий - это работа контроллера в MVC, тогда как эта работа принадлежит представлению в MVP.Есть несколько отличных ресурсов на MVP, и вы обязательно должны их проверить.Для ознакомления вы можете ознакомиться с статьей Википедии: Model-View-Presenter , которая также содержит ссылки на несколько других замечательных ресурсов.
РЕДАКТИРОВАТЬ: вот код из моего личного сценария использования, которыйдовольно похоже.Все это происходит в представлении, основанном на regionReportElement
, предоставленном докладчиком.
private Map<String, Anchor> breadCrumbs = new TreeMap<String, Anchor>();
private Map<String, ReportElement> reportElements = new TreeMap<String, ReportElement>();
// .... other stuff ...
@Override
public void addReportElement(final ReportElement reportElement) {
Anchor anchor = new Anchor(reportElement.getShortName());
anchor.addClickHandler(new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
presenter.onReportElementSelect(reportElement.getId());
}
});
reportElements.put(reportElement.getId(), reportElement);
if (breadCrumbs.get(reportElement.getId()) == null) {
breadCrumbs.put(reportElement.getId(), anchor);
if (breadCrumbs.size() > 0) {
breadCrumbContainer.add(new Label(" > "));
}
breadCrumbContainer.add(anchor);
}
}
// .... other stuff ...