我创建了一个扩展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
并检查小部件是否已附加,但这似乎不是正确的方法...
为什么小部件没有尽快附加?
答案 0 :(得分:2)
您可以在构造函数中调用createEditor而不是onload吗?
在加载页面之前,您的代码似乎正在调用setText 现在,如果是这样的话,那么在构造函数中调用createEditor应该是正确的。
答案 1 :(得分:2)
为什么小部件没有尽快附加?
根据定义,在您将其添加到已经连接的父级(RootPanel
或已添加到RootPanel
的其他内容)之后,它不应该被“附加”。你这样做了吗onLoad
还没有被召唤?
如果你的JS工具(在这种情况下是ace
)要求存在一个DOM节点,那么你不需要等待onLoad
被调用来做任何事情 - 就像你的Widget子类一样构造函数完成后,您必须已经指定了一个元素。
如果您确实要求在对文档执行操作之前将此元素附加到文档,那么是的,当然,您需要等到onLoad被调用。