GWT & GIN: как внедрить PlaceController в виджет с помощью UIBinder - PullRequest
1 голос
/ 19 января 2011

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

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

Edit:

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

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

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

   public class MyInlineLabelSubclass {
       // ...

       public void onClick(ClickEvent event)
       {
         presenter.labelClicked(this);
       }
    }

Ответы [ 2 ]

0 голосов
/ 11 октября 2011

В Интернете я видел пример, где гиперссылки создавались непосредственно из токенов имен, используемых 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/SimpleNestedSample#Step_3:_Creating_a_custom_widget

0 голосов
/ 19 января 2011

Вы можете использовать аннотацию @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 - делегируйте его представителю Presenter (с помощью обратного вызова или интерфейса Presenter).Смотри http://code.google.com/webtoolkit/doc/latest/DevGuideMvpActivitiesAndPlaces.html#Views

...