尚未附加JSNI的GWT小部件

时间:2013-02-13 21:12:24

标签: gwt jsni

我创建了一个扩展SimplePanel并在onLoad()方法中执行一些JSNI的小部件:

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) /*-{
      this.@org.obiba.opal.web.gwt.ace.client.AceEditor::editor.setValue(value);
  }-*/;

  @Override
  public final native String getText() /*-{
      return this.@org.obiba.opal.web.gwt.ace.client.AceEditor::editor.getValue();
  }-*/;

}

问题是当我第一次调用setText时,小部件尚未附加(onLoad尚未调用)。

我将此小部件与UiBinder一起使用。

我可以使用addAttachHandler并检查小部件是否已附加,但这似乎不是正确的方法...

为什么小部件没有尽快附加?

2 个答案:

答案 0 :(得分:2)

您可以在构造函数中调用createEditor而不是onload吗?

在加载页面之前,您的代码似乎正在调用setText 现在,如果是这样的话,那么在构造函数中调用createEditor应该是正确的。

答案 1 :(得分:2)

  

为什么小部件没有尽快附加?

根据定义,在您将其添加到已经连接的父级(RootPanel或已添加到RootPanel的其他内容)之后,它不应该被“附加”。你这样做了吗onLoad还没有被召唤?

如果你的JS工具(在这种情况下是ace)要求存在一个DOM节点,那么你不需要等待onLoad被调用来做任何事情 - 就像你的Widget子类一样构造函数完成后,您必须已经指定了一个元素。

如果您确实要求在对文档执行操作之前将此元素附加到文档,那么是的,当然,您需要等到onLoad被调用。