0

我创建了一个扩展 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并检查是否附加了小部件,但它似乎不是正确的方法......

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

4

2 回答 2

2

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

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

于 2013-02-13T21:22:53.817 回答
2

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

根据定义,它不应该被“附加”,直到你将它添加到一个已经附加的父级(或者是RootPanel,或者另一个已经添加到的东西RootPanel)。你这样做了,onLoad但仍然没有被调用?

如果您的 JS 工具(在本例中ace)要求存在 DOM 节点,那么您无需等待onLoad被调用来执行任何操作 - 在您的 Widget 子类的构造函数完成时,您必须已经指定了一个元素。

如果您确实需要将此元素附加到文档上,然后才能对其执行操作,那么可以,当然,您需要等到调用 onLoad。

于 2013-02-14T02:53:46.487 回答