Вызвать внешнюю функцию из jsni в GWT

У меня есть функция, определенная в файле .js, которая включена в основной файл .html с этим кодом:

<script type="text/javascript" language="javascript" 
    src="js/script.js"></script>

У меня также есть метод JSNI, который вызывает функцию, определенную в файле js:

public native void addJsModule(String name) /*-{
        addNewSection(name);
    }-*/;

Когда я вызываю метод java, я получаю это исключение:

com.google.gwt.event.shared.UmbrellaException: Exception caught: Exception caught: (ReferenceError) @client.registros.home.RegistyHome::addJsModule(Ljava/lang/String;)([string: 'acercade']): addNewSection is not defined

Спасибо!!


person jigarzon    schedule 22.07.2015    source источник


Ответы (2)


Код GWT запускается (по умолчанию) в скрытом iframe, где ваш скрипт недоступен. Существует переменная $wnd, ссылающаяся на объект Window окружающего контекста просмотра (где был загружен ваш скрипт). Поэтому вы должны добавить к своей функции префикс $wnd, чтобы ссылаться на функцию, определенную во внешнем контексте просмотра:

public native void addJsModule(String name) /*-{
    $wnd.addNewSection(name);
}-*/;

См. http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#writing

Обратите внимание, что код не ссылался на объект JavaScript window непосредственно внутри метода. При доступе к окну браузера и объектам документа из JSNI вы должны ссылаться на них как $wnd и $doc соответственно. Ваш скомпилированный скрипт выполняется во вложенном фрейме, а $wnd и $doc автоматически инициализируются для правильной ссылки на окно и документ главной страницы.

person Thomas Broyer    schedule 22.07.2015

Вы должны сделать свой javascript-метод доступным, сохранив его в общем объекте.

Обычно используется конструкция для хранения метода в $doc. В JavaScript сохраните свой метод следующим образом:

document.addNewSection = new function(name) {addNewSection(name);};

Затем используйте его в jsni-body собственного метода GWT следующим образом:

$doc.addNewSection(name);

(вы также можете использовать JSNI $wnd с JS window, если хотите)

Смотрите также:

person slartidan    schedule 22.07.2015
comment
Спасибо. Я добавил этот код: document.addNewSection = new function(name) { addNewSection(name); }; И я все еще получаю это исключение: $doc.addNewSection не является функцией - person jigarzon; 22.07.2015
comment
попробуйте document.addNewSection = new function (name) { alert ('call received in Javascript'); }; и сообщите нам, видите ли вы всплывающее окно. - person slartidan; 22.07.2015