0

GWT ビューをそのプレゼンテーション層にバインドしようとしていますが、何もしていないようです。

これは Spring Roo GWT によって生成されたプロジェクトであり、指定された scaffold を可能な限り使用しようとしています。ビューは単純なボタン (R.ui.xml) で、残りのビューは R.java で定義されています。

public class R extends Composite implements RPresenter.Display {

    interface MyUiBinder extends UiBinder<Widget, R> {}
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    @UiField Button myButton;

    private ClickHandler buttonClickHandler = null;

    public R(){
        initWidget(uiBinder.createAndBindUi(this));
    }

    @UiHandler("myButton")
    void onButtonClick(ClickEvent event){
        GWT.log('Button clicked');
        if (buttonClickHandler != null){    
            GWT.log("buttonClickHandler event triggered");
            buttonClickHandler.onClick(event);
        }
    }

    @Override
    public void setButtonClickHandler(ClickHandler buttonClickHandler) {

        GWT.log("setButtonClickHandler");
        this.buttonClickHandler = buttonClickHandler;
    }

}

発表者:

public class RPresenter {

    public interface Display extends IsWidget {
        void setButtonClickHandler(ClickHandler buttonClickHandler);
    }

    private final Display display;
    private final EventBus eventBus;

    @Inject
    public RPresenter(EventBus eventBus, Display display){
        this.display = display;
        this.eventBus = eventBus;
        bind();
    }

    private void bind(){
        display.setButtonClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                GWT.log("onClick event triggered");
            }
        });
    }

    public void go(HasWidgets container){
        container.add(display.asWidget());
    }

}

私の GIN モジュールでは、生成された ScaffoldModule を ...client.scaffold.ioc パッケージで使用します。

public class ScaffoldModule extends AbstractGinModule {

    @Override
    protected void configure() {

        GWT.log("ScaffoldModule configure");

        bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
        bind(ApplicationRequestFactory.class).toProvider(RequestFactoryProvider.class).in(Singleton.class);
        bind(PlaceController.class).toProvider(PlaceControllerProvider.class).in(Singleton.class);

        //bind(RPresenter.Display.class).to(R.class).in(Singleton.class);
        bind(RPresenter.Display.class).to(R.class);
    }

    static class PlaceControllerProvider implements Provider<PlaceController> {

        private final EventBus eventBus;

        @Inject
        public PlaceControllerProvider(EventBus eventBus) {
            this.eventBus = eventBus;
        }

        public PlaceController get() {
            return new PlaceController(eventBus);
        }
    }

    static class RequestFactoryProvider implements Provider<ApplicationRequestFactory> {

        private final EventBus eventBus;

        @Inject
        public RequestFactoryProvider(EventBus eventBus) {
            this.eventBus = eventBus;
        }

        public ApplicationRequestFactory get() {
            ApplicationRequestFactory requestFactory = GWT.create(ApplicationRequestFactory.class);
            requestFactory.initialize(eventBus);
            return requestFactory;
        }
    }
}

GWT 開発モード コンソールでは、「ScaffoldModule configure」は表示されませんが、バインドが魔法のように別の場所で発生し、それが停止しない限り、イベントがコンポーネントからコンポーネントへ問題なく渡されるため、生成されたスキャフォールドは正常にバインドされているように見えます。コード。

bind(RPresenter.Display.class).to(R.class) を入れると、バインディングが行われないようです。GWTコンソールで得られる唯一の出力は、ビューで呼び出される「ボタンがクリックされました」であり、それ以上は何もありません。私は明らかに何かが欠けています、何かアイデアはありますか?

4

1 に答える 1

1

GWT.log() への呼び出しは、AbstractGinModule から何も出力しません。AbstractGinModule (状況によっては ScaffoldModule) を拡張するクラスは、コンパイル時に gin によって使用され、注入されたインターフェイスに使用する具体的な実装を決定します。残りの説明 (つまり、UI がアプリケーションに表示されること) から、依存性注入が正しく機能しているように見えます。

于 2011-01-13T22:12:16.003 に答える