使用MVP替换嵌套的UIBinder结构/错误处理中的标记

时间:2011-10-14 16:06:11

标签: gwt mvp uibinder

我使用DockLayoutPanel作为我的主面板。 依赖于菜单我单击我更改DLP的中心部分。 例如,我将更改为form1.ui.xml或form2.ui.xml。 这两种形式都有一个“标记”,用于显示错误消息:

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

我正在关注MVP模式(我使用EventBus进行通信),到目前为止一切都很好。我唯一想不出的是如何替换messageblock的内容。或者更加具体,如何从我的MainPresenter访问messageblock。这个东西背后的主要思想是将错误处理捆绑在一个演示者......

我正在寻找像

这样的东西
final Panel panel = DockLayoutPanel.get("messageblock");
panel.add(subwidget);

我很欣赏每一个提示......

2 个答案:

答案 0 :(得分:0)

您可以让Display负责渲染错误(使用renderError(Error)方法创建一些接口)或使Display返回一个HTMLPanel,其他东西可以将错误呈现(某些接口带有{{1 }} 方法)。后者最接近你所说的。让Form1和Form2都实现HTMLPanel getErrorPanel(),然后调用HasErrorPanel

答案 1 :(得分:0)

以下是我的结论。也许它可以帮助别人。 这是基于Riley Lark推荐的 - 感谢Riley btw。

RegistrationPresenter在这里负责注册过程并向用户显示注册表。错误消息应尽可能靠近发生错误的位置显示。

Without error http://www.mikemitterer.at/fileadmin/stacktrace_imagehosting/screenshot-778.jpg

发生错误: Error popped up 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(MessageBlock.ui.xml + MessageBlock.java) (messageblock将在其构造函数中变为不可见)

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

Registration-Widget现在包含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”的Presenter都可以处理/显示消息:

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

        @Override
        public void execute(final MessageEvent event) {
            display.showMessage(event.getMessage());
        }
    });