尚未连接JSNI的GWT小部件

尚未连接JSNI的GWT小部件,gwt,jsni,Gwt,Jsni,我创建了一个扩展SimplePanel的小部件,并在onLoad()方法中执行一些JSNI: 公共类AceEditor扩展SimplePanel实现HasText{ 私有JavaScriptObject编辑器; @凌驾 受保护的void onLoad(){ super.onLoad(); editor=createEditor(getElement()); } 私有静态本机JavaScriptObject createEditor(元素)/*-{ 返回$wnd.ace.edit(元素); }-*

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

公共类AceEditor扩展SimplePanel实现HasText{
私有JavaScriptObject编辑器;
@凌驾
受保护的void onLoad(){
super.onLoad();
editor=createEditor(getElement());
}
私有静态本机JavaScriptObject createEditor(元素)/*-{
返回$wnd.ace.edit(元素);
}-*/;
@凌驾
公共本机void setText(字符串值)/*-{
这是@org.obiba.opal.web.gwt.ace.client.aceditor::editor.setValue(value);
}-*/;
@凌驾
公共最终本机字符串getText()/*-{
返回此内容。@org.obiba.opal.web.gwt.ace.client.aceditor::editor.getValue();
}-*/;
}
问题是当我第一次调用
setText
时,小部件尚未连接(
onLoad
尚未调用)

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

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


你知道为什么这个小部件没有尽快连接吗

能否将对createEditor的调用放在构造函数中而不是onload中

似乎您的代码正在加载页面之前调用setText。

如果是这种情况,那么在构造函数中调用createEditor应该是正确的。

您可以将对createEditor的调用放在构造函数中而不是onload中吗

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

你知道为什么这个小部件没有尽快连接吗

根据定义,在您将其添加到已连接的父级(或者添加到
RootPanel
,或者添加到
RootPanel
)之前,不应将其“附加”。您这样做了吗,并且仍然没有调用
onLoad

如果您的JS工具(在本例中为
ace
)要求存在DOM节点,则无需等待调用
onLoad
即可执行任何操作-在完成小部件子类的构造函数时,您必须已经指定了元素

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

你知道为什么这个小部件没有尽快连接吗

根据定义,在您将其添加到已连接的父级(或者添加到
RootPanel
,或者添加到
RootPanel
)之前,不应将其“附加”。您这样做了吗,并且仍然没有调用
onLoad

如果您的JS工具(在本例中为
ace
)要求存在DOM节点,则无需等待调用
onLoad
即可执行任何操作-在完成小部件子类的构造函数时,您必须已经指定了元素


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

这似乎可以工作,但我认为JS初始化必须在
onLoad
中完成,而不是在构造函数中完成,因为小部件的
div
尚未连接到DOM。您所说的是正确的,前提是您的JS引用的是DOM上以前无法访问的其他元素页面加载。但在你的例子中,它更像是你对象的构造。换句话说,如果没有编辑器本身,你的AceEditor就没有多大用处。此外,你还有在onload之前调用的setText方法,因此,这意味着在epage加载之前,其他一些对象已经需要您的AceEditor。它似乎可以工作,但我认为JS初始化必须在
onLoad
中完成,而不是在构造函数中完成,因为小部件的
div
尚未连接到DOM。如果您的JS引用的是在页面加载之前无法访问的DOM。但在您的情况下,它更像是您对象的构造。换句话说,没有编辑器本身,您的AceEditor就没有多大用处。此外,您在加载之前调用了setText方法,因此这意味着在加载epage之前,其他一些对象已经需要您的AceEditor