GWT UiBinder: событие onClick не срабатывает

Привет народ,

У меня есть виджет, определенный следующим образом:

<g:HTMLPanel>
    <g:HTML ui:field="rootElement" styleName="{resources.mainStructure.widgetBox}"/>
</g:HTMLPanel>

и в соответствующем классе Java есть что-то вроде этого:

@UiField HTML rootElement; 

for(int row = 0; row < 10; row ++) {            
    rootElement.getElement().appendChild(new MyWidget().getElement());
}

где MyWidget что-то вроде этого:

<g:HTMLPanel>

<table  border="0" cellpadding="0" cellspacing="0" class="{resources.mainStructure.areaWidget}"> 
     <tbody class="{resources.mainStructure.workArea}"> 
       <tr>
         <td ui:field="td_1"/> 
         <td ui:field="td_2"/> 
         <td ui:field="td_3"/> 
         <td ui:field="td_4"/> 
         <td ui:field="td_5"/> 
         <td ui:field="td_6"/> 
         <td ui:field="td_7"/> 
         <td ui:field="td_8"/> 
       </tr> 
     </tbody> 
     <tfoot class="{resources.mainStructure.lineaBus}"> 
       <tr> 
         <th ui:field="th_1"/> 
         <th ui:field="th_2"/> 
         <th ui:field="th_3"/> 
         <th ui:field="th_4"/> 
         <th ui:field="th_5"/> 
         <th ui:field="th_6"/> 
         <th ui:field="th_7"/> 
         <th ui:field="th_8"/> 
       </tr> 
     </tfoot> 
 </table> 

В какой-то момент я прикрепляю к определенному td другой виджет, вот этот:

<g:HTMLPanel>

    <g:Anchor styleName="{resources.mainStructure.orangeButton}" ui:field="selectMe">+</g:Anchor>

</g:HTMLPanel>

Теперь проблема в том, что когда я нажимаю якорь вышеуказанного виджета, щелчок не срабатывает. Если я прикрепляю виджет привязки к другому виджету, а не к td, он работает нормально. Пока я понимаю, что проблема в первом виджете, потому что, если я ни к чему не прикрепляю MyWidget, запускается событие onclick "selectMe". Любой комментарий? Спасибо, Крис


person Christian Achilli    schedule 23.02.2011    source источник


Ответы (2)


Это сработало для меня, не знаю, как вы это структурировали. Итак, как я понял, вы не хотите, чтобы вывод был примерно таким:

<g:HTMLPanel>
    ...
         <td ui:field="td_1">
            <g:HTMLPanel>
                <g:Anchor styleName="" ui:field="selectMe">+</g:Anchor>
            </g:HTMLPanel>
         </td> 
    ...

В классе связывания пользовательского интерфейса, где я создал привязку selectMe, я просто добавил UiHandler, как показано ниже:

@UiField Anchor selectMe;
@UiHandler("selectMe")
void onSelectMeAnchorClick(ClickEvent event) {
    Window.alert("clicked on selectMe");
}

Это вызвало предупреждение для меня, когда я нажимаю на ссылку. Надеюсь, это поможет вам.

person Emil    schedule 23.02.2011
comment
Спасибо за ответ. На самом деле, реальный случай немного другой, и я забыл об этом упомянуть (потому что думал, что это лишнее, но из вашего теста я понял, что проблема в нем). Я отредактирую вопрос с более подробной информацией. - person Christian Achilli; 24.02.2011
comment
Проблема в виджете HTML, у меня он тоже не работал. Поэтому я заменил его на VerticalPanel и заменил метод appendChild на rootElement.add(new MyWidget()); - person Emil; 24.02.2011

Будьте осторожны, используя такие вызовы, как...

rootElement.getElement().appendChild(new MyWidget().getElement());

Метод «appendChild(...)» — не что иное, как простое вложение DOM; он не выполняет никакой работы по распространению событий. Есть ли причина, по которой вы не используете метод добавления виджета ()?

rootElement.add(new MyWidget());

Это должно сработать и выстроит все нужные вам события.

person Peter Wagener    schedule 24.02.2011
comment
Упс... только что перечитал комментарии в ответе Эмиля и заметил, что он сказал то же самое. Здесь не на что смотреть... идите дальше.... - person Peter Wagener; 24.02.2011
comment
Спасибо, вы добавили очень полезное объяснение, которое помогло мне - person Christian Achilli; 24.02.2011
comment
Или, в другом подобном случае, RootPanel.get().add(new MyWidget()); - person aggregate1166877; 23.04.2013