В настоящее время я работаю над проектом GWT, и теперь он должен использоваться внешним файлом JavaScript. Сейчас я создаю тестовый прототип, чтобы убедиться, что обе стороны работают правильно.
Когда я запускаю и компилирую, я вижу журналы консоли в браузере из вызываемых событий. Однако Java-методы GWT не вызываются.
Перепробовав множество сценариев, я также заметил, что если я удаляю оболочку $entry
из exportStaticMethods()
, происходит обратное. Я вижу, что System.out
вызывается в моем Java-коде, однако журналы консоли из JavaScript в браузере не вызываются.
Я пытаюсь понять, что вызывает такое поведение, и есть ли небольшой недостающий элемент, который я упустил из виду.
Я уже просмотрел документацию GWT JSNI для вызова метода Java из js и попытался найти решение других связанных вопросов на StackOverflow.
GWT и Java
Я перешел к методу onModuleLoad()
моего класса EntryPoint
и добавил статический метод с именем exportStaticMethods()
. Я также создал файл PokePingClass.java
, указанный ниже.
EntryPointClass.java
public class EntryPointClass implements EntryPoint {
@Override public void onModuleLoad() {
exportStaticMethods();
// load application here.
}
public static native void exportStaticMethods() /*-{
$wnd.pingApp = $entry((function) {
@com.application.PokePingClass::pingApp()();
});
$wnd.pokeApp = $entry((function) {
@com.application.PokePingClass::pokeApp()();
});
}-*/
}
PokePingClass.java
public class PokePingClass {
public static void pokeApp() {
System.out.println("pokeApp() called");
}
public static void pingApp() {
System.out.println("pingApp() called");
}
}
HTML и js
В файле .html
проекта я добавил скрытый элемент div
id 'pokePing', а также файл pokeping.js
.
<html>
<head>
.
. <!-- other stuff -->
.
<script type='text/javascript' src='pokeping.js</script>
</head>
<body>
.
. <!-- other stuff -->
.
<div id="pokePing" style="visibility: hidden;"></div>
</body>
</html>
pokeping.js
$(document).ready(function) {
var $pp = $('#pokePing');
var pokeApp = function() {
console.log("app handling poke event");
window.parent.pokeApp();
}
var pingApp = function() {
console.log("app handling ping event");
window.parent.pingApp();
}
$pp.trigger('pokeApp');
$pp.trigger('pingApp');
}