2011-01-09 25 views
1

我試圖訪問一個界面內某些對象:粘合劑成分,但不知道如何訪問eventBus,requestFactory等,而無需編寫討厭的代碼,將晚上讓我保持清醒(還要注意我對JAVA完全陌生,背景是Perl/Python/PHP)。Spring Roo的GWT與通過UI創建的小部件GIN注:粘結劑

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

注射這種方式失敗, com.ig.client.scaffold.ui.widget.R的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, ...; 

    @Inject 
    public R(EventBus eventBus){ 
     this.eventBus = eventBus; 
     initWidget(uiBinder.createAndBindUi(this)); 
    } 
} 

所以,按照錯誤信息,我創建了一個UIFactory,然後我得到一個錯誤 ...... '{} style.entityComponent'>缺少必需的屬性(S):eventBus元...(好像它正試圖找到UI中的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); 
    } 
} 

讀取和讀取和過去幾天的時間看書,我還沒有看到任何人訪問eventBus,requestFactory和historyController直接在綁定到ui:binder widget的視圖中,這導致了這樣的結論:它可能不是最佳實踐 a nyway。

比方說,我有一個oject,姑且稱之爲代理,代理包含handleButtonClick然後調用eventBus.doSomething()。如何將此代理對象鏈接到ui:活頁夾小部件,而無需實例化它或不必將它傳遞給每個小部件?

是否有可能做一個接口上GIN注入,然後通過實施R級是接口,那麼這將在某種程度上包含我要尋找的對象?

的任何解決方案,它的工作是值得歡迎的,只是尋找一個樣本(一個Java的n00b可以理解),將基本上允許我前端與ROO創建的服務的其餘部分連接。

感謝 Ĵ

回答

2

退房的Model, View, Presenter pattern - 它解決了 這個問題。通常所有的非顯示邏輯應留的你的意見 ,使得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; 
    } 
} 

而且你的GIN模塊:bind(MyPresenter.Display.class).to(MyView.class);

+0

感謝傑森,我是通過谷歌代碼的MVP文檔早上讀,它似乎正是我一直在尋找,後來將實施今晚。 感謝百萬:-) – 2011-01-10 09:09:09