Виджет GWT с JSNI еще не подключен

Я создал виджет, который расширяет SimplePanel и выполняет некоторый JSNI в методе onLoad():

public class AceEditor extends SimplePanel implements HasText {

  private JavaScriptObject editor;

  @Override
  protected void onLoad() {
    super.onLoad();
    editor = createEditor(getElement());
  }

  private static native JavaScriptObject createEditor(Element element) /*-{
      return $wnd.ace.edit(element);
  }-*/;

  @Override
  public native void setText(String value) /*-{
      [email protected]::editor.setValue(value);
  }-*/;

  @Override
  public final native String getText() /*-{
      return [email protected]::editor.getValue();
  }-*/;

}

Проблема в том, что когда я вызываю setText в первый раз, виджет еще не прикреплен (onLoad еще не вызывался).

Я использую этот виджет с UiBinder.

Я мог бы использовать addAttachHandler и проверить, подключен ли виджет, но это не кажется правильным способом сделать это...

Есть идеи, почему виджет не прикрепляется раньше?


person Cedric Thiebault    schedule 13.02.2013    source источник


Ответы (2)


Можете ли вы поместить вызов createEditor в конструктор вместо onload ?

Кажется, что ваш код вызывает setText перед загрузкой страницы.
Теперь, если это так, вызов createEditor в конструкторе должен быть правильным.

person Rohit    schedule 13.02.2013
comment
Кажется, это работает, но я думал, что инициализацию JS нужно выполнять в onLoad, а не в конструкторе, потому что div виджета еще не привязано к DOM. - person Cedric Thiebault; 14.02.2013
comment
То, что вы сказали, верно, если ваш JS ссылается на другие элементы в DOM, к которым он не может получить доступ до загрузки страницы. Но в вашем случае это скорее конструкция вашего объекта. Другими словами, ваш AceEditor не очень полезен без самого редактора. Также у вас есть метод setText, вызываемый перед загрузкой, поэтому это означает, что какой-то другой объект уже нуждается в вашем AceEditor перед epage нагрузка - person Rohit; 14.02.2013

Есть идеи, почему виджет не прикрепляется раньше?

По определению, он не должен быть "присоединен" до тех пор, пока вы не добавите его к уже присоединенному родителю (либо к RootPanel, либо к другому элементу, уже добавленному к RootPanel). Вы сделали это, а onLoad все еще не звонят?

Если для вашего JS-инструмента (в данном случае ace) требуется, чтобы узел DOM существовал, то вам не нужно ждать, пока будет вызван onLoad, чтобы что-то сделать — на момент завершения конструктора вашего подкласса Widget вы уже должны были указать элемент .

Если вам действительно требуется, чтобы этот элемент был прикреплен к документу, прежде чем вы сможете выполнять над ним операции, то да, конечно, вам нужно дождаться вызова onLoad.

person Colin Alworth    schedule 14.02.2013