0

我正在尝试将自定义 javascript 库与我的 SmartGWT 项目集成。

我的页面区域是通过按钮单击动态加载的,因此在 Java 代码中我有类似以下伪代码的内容:

button . onClick {
    contextArea = new contextAreaTypeA()
}

所以我的 contextAreaTypeA 被创建并且在构造函数中我想创建一系列 div 元素,为它们分配 ID,然后在我的自定义库中调用一个函数,它将内容加载到这些 div 中。

SmartGWT 摆脱了获取 ID 或在页面中的任何元素上设置 ID 的任何方式,要在元素上创建 ID,您必须创建自己的小部件并覆盖getInnerHtml或创建类似于 HTMLFlow 的内容并添加类似的myflow.setContent('<div id="myID" ></div>');内容我正在做。

我的问题是,在构造函数中执行此操作意味着当我调用带有 ID 的自定义 javascript 函数时,我创建的这个 div 似乎还没有附加到 dom,所以我总是得到一个空指针。

由于我的模块和文档已经加载并且此内容正在动态添加,因此我无法调用文档就绪或 onModuleLoad,所以我应该如何以及何时检测我的 div 的负载以及何时可以安全地从内部访问 div JSNI 调用?

我尝试了多种方法,例如添加附加处理程序(它们似乎从未被调用),我尝试向 HTMLFlow 添加绘制处理程序,但它们似乎在绘制 htmlflow div 之后但在实际绘制内容之前被调用。我曾尝试在 HTMLFlow() 上调用重绘,但这似乎根本没有调用 onDraw 方法。

我不知道如何将这个库与我的 SmartGWT 集成,如果有人能提出更好的(或任何)方法来做这件事,那就太好了。

4

2 回答 2

0

在一个普通的 GWT oververridingWidget.onAttach()中为我做的伎俩:

public class MyWidget extends Widget {

    @Override
    protected void onAttach() {
        super.onAttach();
        // Call your JSNI code
    }

}

重要的事情:

  • 注意super.onAttach()打电话。它必须在您的 JSNI 调用之前触发。
  • 图像将 onAttach(). 因此,如果您的 JS 代码对图像做了一些技巧(例如检查它们的高度),那么它会为时过早。
于 2013-08-07T09:54:16.427 回答
0

所以事实证明,我认为我遇到的问题根本不是问题,实际上是完全不同的问题。

onAttach() 仍然没有触发,原因我似乎无法解决,但是在 drawHandler 中做所有事情都很好。

我的引用出现 null 的原因是,当我试图访问我正在使用的 javascript 中的元素时

document.getElementById("myDiv");

而我应该一直在使用

$wnd.document.getElementById("myDiv");

这取决于我相信 GWT 在 iframe 中将脚本装箱的方式(我的理解是脚本可以在运行时动态注入?但我可能错了)。

于 2013-08-08T07:56:57.183 回答