如何将JavaScriptObject结果添加到SmartGWT中生成的HTML的特定位置?

时间:2011-10-17 18:48:50

标签: javascript gwt smartgwt jsni

我需要从外部javascript库(我在公共文件夹中保留与客户端,服务器和共享相同的级别)执行Javascript。我需要在SmartGWT VLayout中显示该JavaScript的输出(由ChemDoodle javascript库生成的Canvas)。起初我尝试将javascript代码添加到HTMLFlow对象,然后将HTMLFlow添加到VLayout,但HTMLFlow不会执行Javascript代码(如果我将生成的HTML复制粘贴到另一个浏览器窗口,它可以工作)。我目前正在尝试使用JSOHelper.eval(“java script code here”)来评估javascript代码,从而生成JavaScriptObject。但是我不知道如何在VLayout中“放置”javascript执行的结果。

String javaScriptCode = 
"var viewerCanvas = new ChemDoodle.ViewerCanvas('viewerCanvas', 200, 200);\n" +
"var molFile = 'contentToBeDrawnByChemDoodleCanvas';\n" +
"var moleculeToShow = ChemDoodle.readMOL(molFile);\n" +
"viewerCanvas.loadMolecule(moleculeToShow);\n";

HTMLFlow hflow = new HTMLFlow("<script>\n"+javaScriptCode+"</script>");
vLayout.addMember(hflow);

但是,正如我所说,这不起作用,因为HTMLFlow不会执行&gt;脚本\&gt; block(布尔值设置setEvalScriptBlocks(true)仅适用于从HTMLFlow调用的其他URL)。所以,使用JSOHelper类,你可以做到:

JavaScriptObject jso = JSOHelper.eval(javaScriptCode); // without the <script> tags
// but the following line doesn't work, probably because jso is not a HTMLFlow
HTMLFlow flow2 = HTMLFlow.getOrCreateRef(jso);
// so then this doesn't work either, but I guess it shows where I want to get.
vLayout.addMember(flow2);

我一直试图弄清楚如何使用JSNI方法,但我不知道如何从那里引用vLayout(在javascript中)。知道我们有$ doc和$ win,但是从那里到vLayout(在一个标签内,在其他小部件内),我不知道如何获得。我知道javascript中有一个getElementByID方法,但我不知道如何获取vLayout的id,然后如何将该DIV(我猜)与绘制的画布相关联,以便图像出现在那里。

有没有人可以解释我如何管理(我想通过JSNI是唯一的方法)来执行javascript片段并将结果(生成的画布)显示在我需要的地方?

谢谢!

1 个答案:

答案 0 :(得分:0)

您最好采用不同的方法,使用JSNI仅处理JavaScript实现,并将所有更高级别的操作委派给Java层。

了解JSNI是至关重要的,所以我建议你先从一些文档开始(GWT's coding basics on JSNI非常有用)。

话虽如此,最好的方法是将库实例化的本机(JavaScript)脚本作为单独的文件,并通过模块(或应用程序的).gwt.xml文件预加载。

您可以将该文件中的代码片段包装在自执行块中(即(function() {...})();,以确保它在onModuleLoad()之前运行,但这只是调试糖。