SpringRooGWT在ui:binder创建的小部件上使用GIN注入
我试图访问ui:binder组件中的一些对象,但不确定如何访问eventBus、requestFactory等,而不编写让我夜不能寐的讨厌的代码(还要注意,我对JAVA完全陌生,背景是Perl/Python/PHP) 我的ui.xml文件:SpringRooGWT在ui:binder创建的小部件上使用GIN注入,gwt,spring-roo,uibinder,gwt-gin,Gwt,Spring Roo,Uibinder,Gwt Gin,我试图访问ui:binder组件中的一些对象,但不确定如何访问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='ur
<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没有默认(零参数)构造函数
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));
}
}
public类R扩展了复合{
接口MyUiBinder扩展了UiBinder{}
私有静态MyUiBinder=GWT.create(MyUiBinder.class);
专用最终事件总线事件总线;
@UiField SimplePanel fieldA。。。;
@注入
公共R(事件总线事件总线){
this.eventBus=eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
}
因此,根据错误消息,我创建了一个UIFactory,然后得到一个错误
... '{style.entityComponent}'>缺少必需的属性:eventBus元素。。。(似乎它正在试图在ui:binder样式表中找到eventBus
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);
}
}
public类R扩展了复合{
接口MyUiBinder扩展了UiBinder{}
私有静态MyUiBinder=GWT.create(MyUiBinder.class);
专用最终事件总线事件总线;
@UiField SimplePanel fieldA。。。;
public@uir(EventBus EventBus){
this.eventBus=eventBus;
initWidget(uiBinder.createAndBindUi(this));
}
@注入
@UIR制造商(){
返回新的R(eventBus);
}
}
在过去几天的阅读中,我没有看到任何人在绑定到ui:binder小部件的视图中直接访问eventBus、requestFactory和historyController,这导致了一个结论,即这可能不是最佳实践
无论如何
假设我有一个项目,我们称之为代理,代理包含handleButtonClick,然后调用eventBus.doSomething()。如何将这个代理对象链接到ui:binder小部件,而不必实例化它或将它传递给每个小部件
是否可以在接口上进行GIN注入,然后通过类R实现该接口,该类将以某种方式包含我正在寻找的对象
任何可行的解决方案都是受欢迎的,只要寻找一个示例(JavaN00B可以理解),它基本上允许我将前端与ROO创建的其余服务连接起来
谢谢
J查看-它解决了
这个问题。通常所有非显示逻辑都应该被排除在外
使1)非显示逻辑可以在没有
在(实例化速度较慢)浏览器中运行,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;
}
}
公共类MyView扩展复合实现MyPresenter.Display{
接口MyViewUiBinder扩展UiBinder{}
私有静态MyViewUiBinder=GWT.Create(MyViewUiBinder.class);
私有ClickHandler按钮ClickHandler=null;
公共MyView(){
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler(“myButton”)
作废按钮单击(单击事件){
if(buttonClickHandler!=null){
按钮ClickHandler.onClick(事件);
}
}
@凌驾
公共无效设置按钮ClickHandler(ClickHandler按钮ClickHandler){
this.buttonClickHandler=buttonClickHandler;
}
}
在您的GIN模块中:
bind(MyPresenter.Display.class).to(MyView.class)
谢谢Jason,我今天早上读了Google code的MVP文档,它似乎正是我想要的,将在今晚晚些时候实现。万分感谢:-)嗨,杰森,我没有让你的例子发挥作用,你有我可用的源代码吗?或者你介意看看我的代码并指出问题所在吗?我无法让绑定正常工作,并且已经挣扎了好几个星期。为什么你不针对你遇到的问题提出一个新问题,并从这里的评论链接到它,这样我就可以看到它了?嗨,Jason,GWT邮件列表上的某个人帮我解决了这个问题,谢谢你为我指明了正确的方向。