UIによって作成されたウィジェットにジンインジェクションを備えたスプリングルーGWT:バインダー
-
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で失敗します。
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要素...(それが見つけようとしているようですUIのEventBus:Binder StyleSheet。
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);
}
}
過去数日間の読書と読書、さらに読み物から、UI:Binder Widgetにバインディングされたビューで直接EventBus、RequestFactory、HistoryControllerにアクセスしている人を見たことがありません。とりあえず。
私がOjectを持っているとしましょう、それをプロキシと呼びましょう、プロキシにはhandleButtonClickが含まれています。このプロキシオブジェクトをUI:バインダーウィジェットにインスタンス化する必要なく、またはすべてのウィジェットに渡すことなくリンクするにはどうすればよいですか?
インターフェイスでジンインジェクションを行い、クラスRを介してそのインターフェイスを実装することは可能ですか?
動作するソリューションは、基本的にフロントエンドをROOが作成した残りのサービスと接続できるサンプル(Java N00Bが理解できる)を探しているだけで、歓迎されます。
ありがとうj
解決
をチェックしてください モデル、ビュー、プレゼンターパターン - この問題を解決します。一般に、すべての非ディスプレイロジックはビューから守る必要があります。これにより、1)非ディスプレイロジックを(インスタンス化されるのが遅い)ブラウザ内で実行せずにユニットテストを行うことができます。非ディスプレイロジック。
これがあなたが探している動作を示す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);