Использование GWT JSNI для интеграции с js-файлами
В настоящее время я работаю над проектом GWT, и теперь он должен использоваться внешним файлом JavaScript. Я создаю тестовый прототип прямо сейчас, чтобы обе стороны работали правильно.
Когда я запускаю и компилирую, я вижу журналы консоли в браузере по вызываемым событиям. Однако Java-методы GWT не вызываются.
После попытки многих сценариев, я также заметил, что если я удаляю $entry
обертка от exportStaticMethods()
происходит обратное. Я вижу System.out
Вызывается в моем коде Java, однако журналы консоли из JavaScript в браузере не вызываются.
Я пытаюсь выяснить, что вызывает поведение, и если есть небольшая недостающая часть, я пропустил.
Я уже рассмотрел документацию GWT JSNI для вызова метода Java из js и попытался найти решение по другим связанным вопросам в Stackru.
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');
}
2 ответа
Я нашел похожий пост, но ключом к этому было возвращение вызовов методов в функции JSNI. После этого все работает хорошо.
public static native void exportStaticMethods() /*-{
$wnd.pingApp = $entry((function) {
return @com.application.PokePingClass::pingApp()();
});
$wnd.pokeApp = $entry((function) {
return @com.application.PokePingClass::pokeApp()();
});
}-*/
public static native void exportStaticMethods() /*-{
$wnd.pingApp = $entry(function) {
@com.application.PokePingClass.pingApp()();
}
$wnd.pokeApp = $entry(function) {
@com.application.PokePingClass.pokeApp()();
}
}-*/
Это не действительно JS и не имеет смысла как JSNI. Попробуйте это вместо этого:
$wnd.pingApp = $entry(function() {
@com.application.PokePingClass::pingApp()();
});
$wnd.pokeApp = $entry(function() {
@com.application.PokePingClass::pokeApp()();
});
Редактировать, потому что я все еще не так, забыл ::
оператор для участников.