我有一个代表网站BreadCrumb的视图,我通过设置像这样的面包屑来更新视图
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())
content.add(anchor);
content.add(new InlineHTML(" > "));
}
content.add(crumbs.get(crumbs.size()-1).getText());
}
现在,我想为每个添加的Anchor添加EventHandlers。我可以通过执行类似anchor.addClickHandler(...)
的操作来设置for循环中的处理程序,但我使用的是MVP,因此视图不必管理处理程序......我猜。在演示者中,我可以访问具有所有锚点的面板。
我的问题是:如何从演示者访问锚点并设置eventHandler?
答案 0 :(得分:1)
在MVP环境中,创建UI元素和捕获事件应该在View中进行,然后View应该处理这些事件并调用Presenter采取适当的操作,如下所示:
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中Controller的工作,而该工作属于MVP中的View。 MVP上有一些很棒的资源,你一定要把它们检查出来。对于基础知识,您可以看到Wikipedia Article: 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 ...