Заменить маркер во вложенной структуре UIBinder / Обработка ошибок с помощью MVP - PullRequest
0 голосов
/ 14 октября 2011

Я использую DockLayoutPanel в качестве основной панели.В зависимости от меню, которое я нажимаю, я меняю центральную часть DLP.Например я меняю либо на form1.ui.xml, либо на form2.ui.xml.Обе эти формы имеют «маркер», реализованный для отображения сообщения об ошибке:

<g:HTMLPanel ui:field="messageblock"/>

Я следую шаблону MVP (я использую EventBus для связи), и до сих пор все работает отлично.Единственное, что я не могу понять, это как заменить содержимое блока сообщений.Или чтобы быть более конкретным, как получить доступ к блоку сообщений из моего MainPresenter.Основная идея этого материала - объединить обработку ошибок в одном докладчике ...

Я ищу что-то вроде

final Panel panel = DockLayoutPanel.get("messageblock");
panel.add(subwidget);

Я ценю каждый намек ...

Ответы [ 2 ]

0 голосов
/ 18 октября 2011

Вот вывод, к которому я пришел. Может быть, это помогает кому-то еще. Это основано на том, что порекомендовал Райли Ларк - спасибо Райли.

RegistrationPresenter здесь отвечает за процесс регистрации и показывает пользователю регистрационную форму. Сообщение об ошибке должно отображаться как можно ближе к месту, где произошла ошибка.

Без ошибок http://www.mikemitterer.at/fileadmin/stacktrace_imagehosting/screenshot-778.jpg

Произошла ошибка: Ошибка высветилась http://www.mikemitterer.at/fileadmin/stacktrace_imagehosting/screenshot-780.jpg

Вот примерное описание того, как я реализовал это поведение:

public class RegistrationPresenter implements Presenter {

public interface Display extends StatusDisplay, HasMessageBlock {
    Widget asWidget();

    void setData(RegistrationTO registration);
}

private final Display   display;
private final EventBus  eventBus;
    ...

как вы можете видеть, это Display реализует HasMessageBlock:

public interface HasMessageBlock {
void showMessage(Message message);

void hideMessage();
    }

Существует блок сообщений UIBinder-Widget (MessageBlock.ui.xml + MessageBlock.java) (блок сообщений будет превращен в невидимый в своем конструкторе)

    <g:HTMLPanel styleName="errorblock" ui:field="messageblock">
        <div id="errorMsg" class="flurid">
            <div class="row">
                <div class="column width_15/16">
                    <h3><ui:msg key="errorblock.headline">An error occurred...</ui:msg></h3>
                </div>
                <div class="column orientation-right islink width_1/16">
                    <g:Image resource='{res.xgray}' ui:field="image" />
                </div>
     ...

Виджет регистрации теперь включает MessageBlock

<g:HTMLPanel styleName="registration" ui:field="panel">
    <div class="uniForm maxgrid700">
        <h1>
            <ui:msg key="registration.headline">Registration</ui:msg>
        </h1>
        <c:MessageBlock ui:field="messageblock"/>
        <div class="ctrlHolder">
            <p class="label">
                <em></em>
                <ui:msg key="registration.name">Name:</ui:msg>
            </p>
     ...

Теперь, если кто-то отправляет сообщение

eventbus.fireEvent(new MessageEvent(new MessageImpl(Message.MESSAGETYPE.ERROR, "Server Error Message")));

каждый докладчик, который имеет «HasMessageBlock» для своего дисплея, может обрабатывать / отображать сообщение:

        eventBus.addHandler(MessageEvent.TYPE, new MessageEventHandler() {

        @Override
        public void execute(final MessageEvent event) {
            display.showMessage(event.getMessage());
        }
    });
0 голосов
/ 14 октября 2011

Вы можете либо сделать Display ответственным за рендеринг ошибки (создать интерфейс с методом renderError(Error)), либо заставить Display возвращать HTMLPanel, в который что-то еще может отобразить ошибку (некоторый интерфейс с методом HTMLPanel getErrorPanel()),Последнее ближе всего к тому, о чем вы говорите.Пусть Form1 и Form2 реализуют HasErrorPanel, а затем вызывают getErrorPanel().add(subWidget).

...