GWT & GIN: Как внедрить PlaceController в виджет, используя Uibinder

StackOverflow https://stackoverflow.com/questions/4739952

Вопрос

У меня есть подкласс InlineLabel, который я использовал в Uibinder. Как я могу внедрить в него Placecontroller через джин, чтобы виджет можно было использовать в Uibinder? (Напомним, что Uibinder требует конструктора без Args.)

Если это невозможно, какой самый чистый способ сделать PlaceController доступным для виджета, чтобы его можно было использовать виджетом во время событий OnClick ()?

Редактировать:

Я не уверен, что MVP - это действительно лучшее решение в этом случае (однако, я рад, что вы передумаете.

У меня будут десятки этих экземпляров InlineLabel, объявленных в моем файле uibinder foo.ui.xml. Если я внедряю MVP, это означает объявление каждого из этих случаев как члены @uifield в точке зрения. Это становится довольно громоздким, когда у меня их так много. Вот почему я надеялся внедрить PlaceController в каждый из InlineLabels в полуавтоматическом порядке и избегать необходимости вручную подключать их в вид.

Также было бы приемлемо, если бы был способ ввести докладчика в каждый из InlineLabels ... тогда делегирование может быть сделано что -то вроде:

   public class MyInlineLabelSubclass {
       // ...

       public void onClick(ClickEvent event)
       {
         presenter.labelClicked(this);
       }
    }
Это было полезно?

Решение

Вы можете использовать @UiHandler аннотация, чтобы добавить обработчик в элемент Uibinder, не имея @UiField ссылка:

<ui:UiBinder>
  <g:InlineLabel ui:field="name"/>
  <g:InlineLabel ui:field="address"/>
  <g:InlineLabel ui:field="zipCode"/>
</ui:UiBinder>

И, по мнению:

@UiHandler({"name","address","zipCode"})
void onClick(ClickEvent event) {
  // Source will be one of the three InlineLabels.
  presenter.labelClicked(event.getSource());
}

Не придайте вашему виджету прямую ручку для PlaceController - делегата в докладчик представления (через обратный вызов или интерфейс докладчика). Видеть http://code.google.com/webtoolkit/doc/latest/devguidemvpactivitiesandplaces.html#views

Другие советы

Я видел пример онлайн, в котором гиперссылки были построены непосредственно из токенов имени, используемых PlaceController. например.

<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
    xmlns:g="urn:import:com.google.gwt.user.client.ui">
  <ui:with type="com.gwtplatform.samples.nested.client.NameTokens" field="nameTokens"></ui:with>
  <g:HTMLPanel>
    <g:InlineHyperlink targetHistoryToken="{nameTokens.getHomePage}">Home</g:InlineHyperlink> | 
    <g:InlineHyperlink targetHistoryToken="{nameTokens.getAboutUsPage}">About Us</g:InlineHyperlink> | 
    <g:InlineHyperlink targetHistoryToken="{nameTokens.getContactPage}">Contact</g:InlineHyperlink>
  </g:HTMLPanel>
</ui:UiBinder>

Смотрите здесь, чтобы узнать больше об этом примере:

http://code.google.com/p/gwt-platform/wiki/simplensateSample#step_3:_Creating_a_custom_widget

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top