Spring ROO GWT с GIN-инъекцией для виджетов, созданных ui: binder - PullRequest
1 голос
/ 09 января 2011

Я пытаюсь получить доступ к некоторым объектам внутри компонента 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='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 ... (похоже, что он пытается найти eventBus в таблице стилей ui: binder.

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, что привело к выводу, что это, вероятно, не лучший способ в любом случае.

Скажем, у меня есть oject, назовем его Proxy, прокси содержит handleButtonClick, который затем вызывает eventBus.doSomething ().Как связать этот объект Proxy с виджетом ui: binder, не создавая его экземпляры или не передавая его каждому виджету?

Можно ли выполнить внедрение GIN в интерфейс, а затем реализовать этот интерфейсчерез класс R, который затем каким-то образом будет содержать объекты, которые я ищу?

Любое решение, которое работает, приветствуется, просто ищет образец (который может понять Java n00b), который в основном позволит мне подключить мойинтерфейс с остальными сервисами, созданными ROO.

Спасибо J

1 Ответ

2 голосов
/ 09 января 2011

Проверьте модель, представление, образец Presenter - это решает Эта проблема. Как правило, вся логика не должна отображаться ваших взглядов, так что 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);

...