我使用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);
我很欣赏每一个提示......
答案 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());
}
});