2011-01-09 8 views
1

ui:バインダーコンポーネント内のオブジェクトにアクセスしようとしていますが、eventBus、requestFactoryなどにアクセスする方法がわかりません。私は夜も目を覚ましておいてください(また、私はJAVAを完全に新しくしている、バックグラウンドはPerl/Python/PHPです)。ui:binderによって作成されたウィジェットにGINインジェクションを適用したSpring ROO GWT

マイui.xmlファイル:この方法は com.ig.client.scaffold.ui.widget.Rで失敗eventBusを注入

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

にはデフォルト(ゼロ引数)コンストラクタを持っていません。

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}'>必要な属性(複数可)行方不明: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でeventBusを見つけようとしているように思えますui:バインダーウィジェットへのバインディングのビューに直接入りました。結局のところ、ベストプラクティスではないと結論しました。 aとにかく

私はオブジェクトを持っているとしましょう、それをプロキシと呼ぶことにしましょう、プロキシにはhandleButtonClickが含まれていて、次にeventBus.doSomething()を呼び出します。このProxyオブジェクトを、インスタンス化することなく、またはすべてのウィジェットに渡すことなく、ui:binderウィジェットにリンクするにはどうすればよいですか?

インターフェイスでGIN注入を行い、クラスRを介してそのインターフェイスを実装することは可能ですか?それで何とか私が探しているオブジェクトが含まれていますか?

ROOによって作成された残りのサービスとフロントエンドを基本的に接続できるようにするサンプル(Java n00bが理解できる)を探していれば、歓迎です。

おかげ J

答えて

2

Model, View, Presenter patternをチェックアウト - それは この問題を解決します。一般的には、すべての非表示ロジックは、 のビューに保持されている必要があります。そのため、非表示ロジックは、 ブラウザ内で実行されていません(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

おかげでジェイソンは、私は今朝Google CodeののMVPのドキュメントを通して読んでいたし、私が探していたまさにように見えた、今夜遅くに実装します。 ありがとう百万:-) –

+0

こんにちはジェイソン、私はあなたの例を働かせていません、私のためのソースをご利用いただけますか、または私のコードを見て問題を指摘してもらえますか?今数週間苦労しています。 –

+0

あなたが持っている問題に固有の新しい質問をして、ここのコメントからリンクして見せてみませんか? –

関連する問題