Как добавить результат JavaScriptObject в определенное место результирующего HTML-кода в SmartGWT? - PullRequest
1 голос
/ 17 октября 2011

Мне нужно выполнить Javascript из внешней библиотеки javascript (которую я оставил в общей папке на том же уровне, что и клиент, сервер и общий доступ).Мне нужно, чтобы вывод этого JavaScript (который является Canvas, сгенерированным библиотекой JavaScript ChemDoodle) отображался в SmartGWT VLayout.Сначала я попытался добавить код javascript в объект HTMLFlow, а затем добавить HTMLFlow в VLayout, однако HTMLFlow не выполнит код Javascript (если я скопирую и вставлю полученный HTML в другое окно браузера, это будет работать).В настоящее время я пытаюсь оценить код javascript с помощью JSOHelper.eval («код сценария java здесь»), в результате чего получается JavaScriptObject.Однако я не знаю, как «поместить» результат выполнения javascript в VLayout.

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 не выполнит скрипт>\> block (логическое значение setEvalScriptBlocks (true) применяется только для других URL-адресов, вызываемых из HTMLFlow).Итак, с классом 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 и как связать этот DIV (я полагаю) с нарисованным холстом, чтобы изображение там появлялось.

Может ли кто-нибудь объяснить мне, как мне удается (я думаю, что через JSNI это единственный способ) сделать так, чтобы этот фрагмент javascript выполнялся и результат (сгенерированный холст) отображался там, где мне нужно?

Спасибо!

1 Ответ

0 голосов
/ 06 марта 2012

Лучше использовать другой подход, используя JSNI для обработки только реализаций JavaScript и делегируя все операции более высокого уровня слою Java.

Знакомство с JSNI имеет решающее значение, поэтому я предлагаю вам начать с некоторой документации ( Основы кодирования GWT на JSNI очень полезны).

Сказав это, лучшим подходом будет иметь собственный (JavaScript) сценарий для создания экземпляра библиотеки в виде отдельного файла и вставки его предварительной загрузки через файл * (1009 *) модуля (или приложения).

Чем вы можете обернуть фрагмент кода в этом файле в самовыполняющийся блок (т. Е. (function() {...})();, чтобы убедиться, что он будет работать до onModuleLoad(), но это всего лишь отладка сахара.

...