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 преди страница натоварване - person Rohit; 14.02.2013

Някаква идея защо джаджата не е прикачена по-рано?

По дефиниция той не трябва да бъде „прикачен“, докато не го добавите към вече прикачен родител (или към RootPanel, или друго нещо, което вече е добавено към RootPanel). Направихте ли го и onLoad все още не е извикан?

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

Ако наистина изисквате този елемент да бъде прикачен към документа, преди да можете да извършвате операции върху него, тогава да, разбира се, трябва да изчакате, докато onLoad бъде извикан.

person Colin Alworth    schedule 14.02.2013