如何使用MVP动态添加事件处理程序到Widget

时间:2011-09-21 20:36:13

标签: gwt handler mvp

我有一个代表网站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?

1 个答案:

答案 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 ...