2017-01-31 8 views
1

Я создал следующий класс как расширение gwtbootstrap3 Tooltip. Есть как минимум 2 причины, по которым я хочу получить класс всплывающих подсказок gwtbootstrap3:GWT/GWTBootstrap3 Расширение всплывающей подсказки: Исключение с addHandler в C'tor

1.) Добавить обработчик onWindowClosing, когда показана всплывающая подсказка, чтобы я мог скрыть() всплывающую подсказку, когда пользователь покидает страницу (это - насколько я понимаю - функция, которая также не поддерживается в Bootstrap, не так ли?)

2.) Я хочу, чтобы всплывающие подсказки отображались, когда страница отображается на iPads или iPhone, поскольку они ведут себя странно, когда всплывающие подсказки (первый наконечник показывает всплывающую подсказку, второй конец выполняет кнопку, что не совсем то, что пользователь ожидает)

Обратите внимание, что приведенный ниже класс еще не закончен ... но уже при t на сцене я получаю исключение при добавлении обработчика. Также обратите внимание, что он генерирует исключение независимо от того, какой тип обработчика (ShowHandler, ShownHandler и т. Д.) Я добавляю.

Любая помощь очень ценится.

package com.mypackage.client.widgets.featureWidgets; 
    import org.gwtbootstrap3.client.shared.event.ShowEvent; 
    import org.gwtbootstrap3.client.shared.event.ShowHandler; 
    import org.gwtbootstrap3.client.ui.constants.Trigger; 

    import com.google.gwt.event.shared.HandlerRegistration; 
    import com.google.gwt.user.client.Window; 
    import com.google.gwt.user.client.Window.ClosingEvent; 

    public class Tooltip extends org.gwtbootstrap3.client.ui.Tooltip { 

     private boolean isMobile; 
     private HandlerRegistration windowClosingHandlerRegistration; 
     private final Tooltip tooltip; 

     public Tooltip() { 
      super(); 
      tooltip = this; 

      this.addShowHandler(new ShowHandler() { 
       @Override 
       public void onShow(final ShowEvent showEvent) { 
        // TODO Auto-generated method stub 
        if (windowClosingHandlerRegistration == null) { 
         windowClosingHandlerRegistration = Window.addWindowClosingHandler(new Window.ClosingHandler() { 
          @Override 
          public void onWindowClosing(final ClosingEvent arg0) { 
           tooltip.hide(); 
          } 
         }); 
        } 

       } 
      }); 
     } 


    } 


    When I create a instance of this tooltip using the following: 

    [...] 
     <b:ButtonToolBar ui:field="itemButtonToolBar" addStyleNames="hiddenPrint"> 
     <b:ButtonGroup> 

      <a:Tooltip title="{msgs.buttomTitleAddItem}" container="body"> 
       <b:Button ui:field="addItemButton" icon="PLUS"/> 
      </a:Tooltip>           
    [...] 

Я получаю следующее исключение при попытке добавить обработчика, почему?

SEVERE: (TypeError) : Cannot read property 'addHandler_11_g$' of undefinedcom.google.gwt.core.client.JavaScriptException: (TypeError) : Cannot read property 'addHandler_11_g$' of undefined 
     at Unknown.addShowHandler_2_g$([email protected]:57195) 
     at Unknown.Tooltip_6_g$([email protected]:57685) 
     at Unknown.build_f_Tooltip2_0_g$([email protected]:31606) 
     at Unknown.get_f_Tooltip2_0_g$([email protected]:31831) 
     at Unknown.build_f_ButtonGroup1_0_g$([email protected]:31524) 
     at Unknown.get_f_ButtonGroup1_0_g$([email protected]:31791) 
     at Unknown.build_itemButtonToolBar_0_g$([email protected]:31696) 
     at Unknown.get_itemButtonToolBar_0_g$([email protected]:31876) 
     at Unknown.createAndBindUi_58_g$([email protected]:31437) 
     at Unknown.createAndBindUi_59_g$([email protected]:31441) 
     at Unknown.ItemButtonGroup_2_g$([email protected]:30733) 
     at Unknown.$init_589_g$([email protected]:37722) 
     at Unknown.SummaryWidget_1_g$([email protected]:37686) 
     at Unknown.loadSummaryWidget_0_g$([email protected]:4991) 
     at Unknown.setSummary_1_g$([email protected]:5028) 
     at Unknown.onSuccess_8_g$([email protected]:3312) 
     at Unknown.onSuccess_9_g$([email protected]:3317) 
     at Unknown.onResponseReceived_0_g$([email protected]:156917) 
     at Unknown.fireOnResponseReceived_0_g$([email protected]:129224) 
     at Unknown.onReadyStateChange_0_g$([email protected]:129532) 
     at Unknown.<anonymous>([email protected]:172082) 
     at Unknown.apply_0_g$([email protected]:104636) 
     at Unknown.entry0_0_g$([email protected]:104692) 
     at Unknown.<anonymous>([email protected]:104672) 

ответ

2

Отказ от ответственности: Я использую gwtbootstrap3 v0.9.2, и я считаю, что это та же версия, как вы используете, как я получил ту же ошибку для вашего кода.

Для всплывающей подсказки требуется виджет (в вашем случае кнопка - виджет всплывающей подсказки). Подсказка использует его виджет для обработки всех событий - например, source code для addShowHandler.

Теперь вы должны понять, как строится вся структура:

  • сначала подсказке создается (остроумие нет виджета набор)
  • то кнопка создается
  • setWidget метод ToolTip, называется в установить кнопку в качестве виджета

так что, когда вы используете addShowHandler метод в конструкторе, вы на самом деле назвать widget.addHandler в то время как WID get - null.

Вы можете проверить это Window.alert(tooltip.getWidget() == null ? "null" : tooltip.getWidget().toString());


Есть несколько способов, чтобы сделать его работу (позже, тем лучше):

  1. ждать структуры DOM будет построен запланировав отложено (если вы уверены, что виджет будет в конечном итоге установлен):

    Scheduler.get().scheduleDeferred(new ScheduledCommand() { 
        @Override 
        public void execute() { 
         // set up events handling 
        } 
    }); 
    
  2. переопределение setWidget метод (примечание Тхет есть два метода: setWidget(Widget w) и setWidget(IsWidget w)):

    @Override 
    public void setWidget(Widget w) { 
        super.setWidget(w); 
        // set up events handling 
    } 
    
  3. вам не нужно addWindowClosingHandler в showEvent обработчика, вы можете сделать это прямо в конструкторе:

    public class Tooltip extends org.gwtbootstrap3.client.ui.Tooltip { 
    
        private boolean isMobile; 
        private final Tooltip tooltip; 
    
        public Tooltip() { 
         super(); 
         tooltip = this; 
    
         Window.addWindowClosingHandler(new Window.ClosingHandler() { 
          @Override 
          public void onWindowClosing(final ClosingEvent arg0) { 
           tooltip.hide(); 
          } 
         }); 
        } 
    } 
    
+0

Hi Adam, Спасибо за ваше объяснение и вашу помощь. Ты мой герой! – user668338

Смежные вопросы