春季Roo GWT带杜松子酒注射在UI创建的小部件上:活页夹
-
08-10-2019 - |
题
我正在尝试访问UI中的某些对象:活页夹组件,但不确定如何访问EventBus,requestFactory等,而无需编写令人讨厌的代码,这会让我在夜间保持清醒(请注意,我是完全新手的Java,背景为Perl/Python/PHP)。
我的ui.xml文件:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>
<ui:style>
...
</ui:style>
<g:HorizontalPanel>
...
</g:HorizontalPanel>
</ui:UiBinder>
以这种方式注入EventBus,com.ig.client.scaffold.ui.widget.r失败了,没有默认值(零args)构造函数。
public class R extends Composite {
interface MyUiBinder extends UiBinder<Widget, R> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private final EventBus eventBus;
@UiField SimplePanel fieldA, ...;
@Inject
public R(EventBus eventBus){
this.eventBus = eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
}
因此,根据错误消息,我创建了一个uifactory,然后得到一个错误...'{style.entityComponent}'>缺少必需的属性(s):eventbus element ...(似乎正在尝试找到它UI中的EventBus:Binder样式表。
public class R extends Composite {
interface MyUiBinder extends UiBinder<Widget, R> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
private final EventBus eventBus;
@UiField SimplePanel fieldA, ...;
public @UiConstructor R(EventBus eventBus){
this.eventBus = eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
@Inject
@UiFactory R makeR(){
return new R(eventBus);
}
}
从阅读和阅读以及过去几天的更多阅读中,我还没有看到任何人直接访问EventBus,RequestFactory和History Controller在与UI绑定到UI的视图:Binder:Binder小部件,这导致结论可能不是最好的实践反正。
假设我有一个OPT,我们称其为代理,代理包含handleButtonClick,然后称eventbus.dosomething()。如何将此代理对象链接到UI:binder小部件,而无需实例化或不必将其传递到每个小部件?
是否可以在接口上进行杜松子酒注入,然后通过类R类实现该接口,然后以某种方式包含我要寻找的对象?
欢迎任何工作的解决方案,只是寻找一个样本(Java N00B可以理解的样本),这基本上使我能够将我的前端与Roo创建的其余服务联系起来。
谢谢J。
解决方案
查看 模型,视图,演示者模式 - 它解决了这个问题。通常,所有非显示逻辑都应放在您的视图之外,以便1)可以对非显示逻辑进行单位测试,而无需在A内部运行(慢速到实例化)浏览器和2)不同的显示器可以插入同一应用程序而无需重复的应用程序非显示逻辑。
这是一个MVP示例,展示了您要寻找的行为(请注意,样式与活动和地点实施略有不同)。
mypresenter.java:
public class MyPresenter {
public interface Display extends IsWidget {
void setButtonClickHandler(ClickHandler buttonClickHandler);
}
private final Display display;
private final EventBus eventBus;
@Inject
public MyPresenter(EventBus eventBus,
Display display)
{
this.display = display;
this.eventBus = eventBus;
bind();
}
private void bind() {
display.setButtonClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
eventBus.fireEvent(new MyButtonClickedEvent());
}
});
}
public void go(HasWidgets container) {
container.add(display.asWidget());
}
}
myview.ui.xml:
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:g='urn:import:com.google.gwt.user.client.ui'
xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>
<g:Button ui:field="myButton"/>
</ui:UiBinder>
myview.java
public class MyView extends Composite implements MyPresenter.Display {
interface MyViewUiBinder extends UiBinder<Widget, MyView> {}
private static MyViewUiBinder uiBinder = GWT.Create(MyViewUiBinder.class);
private ClickHandler buttonClickHandler = null;
public MyView() {
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("myButton")
void onButtonClick(ClickEvent event) {
if (buttonClickHandler != null) {
buttonClickHandler.onClick(event);
}
}
@Override
public void setButtonClickHandler(ClickHandler buttonClickHandler) {
this.buttonClickHandler = buttonClickHandler;
}
}
在您的杜松子酒模块中: bind(MyPresenter.Display.class).to(MyView.class);