Как добавить eventHandlers в виджет, добавленный динамически в представление с использованием MVP - PullRequest
1 голос
/ 22 сентября 2011

У меня есть представление, которое отображает 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());
}

Теперь я хочу добавить EventHandlers в каждую добавленную привязку. Я мог бы просто установить обработчик в цикле for, выполнив что-то вроде anchor.addClickHandler(...), но я использую MVP, поэтому представление не должно управлять обработчиками ... Я думаю. В докладчике у меня есть доступ к панели, которая имеет все якоря.

У меня вопрос: как получить доступ к якорям из докладчика и установить eventHandler?

1 Ответ

1 голос
/ 22 сентября 2011

В среде 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 ...
...