Я создаю веб-приложение с GWT, и я хочу дать пользователям возможность расширять его функциональность с помощью своего рода Javascript API, который будет взаимодействовать с ядром приложения, написанным на GWT.По сути, этот JS API сопоставлялся бы с некоторыми из моих внутренних методов GWT, которые выполняли бы реальную работу.
Итак, чтобы добиться этого, я прочитал в официальной документации GWT JSNI прием, заключающийся в создании глобальной переменной JSиз GWT и присвоение ему вызова фактическому методу GWT.Затем я сделал бы вызов в моем рукописном коде JS через эту переменную.
К сожалению, я не смог заставить его работать (пример содержал синтаксические ошибки, но я не уверен, что он даже был протестирован).Проведя дополнительные исследования, я нашел на этом сайте похожее решение, которое назначает JS var анонимную функцию, которая выполняет вызов.Это выглядит так:
/*GWT code that assigns the anonymous function*/
private static native void loadWrapper() /*-{
$wnd.showMessage =
$entry(@com.Glob3Mobile.client.TestApi::msgBox());
}-*/;
public static void msgBox() {
Window.alert("hello");
}
Это решение выглядит многообещающе, но я не смог заставить его работать.Когда я делаю "window.showMessage ();"в моем рукописном коде JS это не будет работать.Я обнаружил следующие проблемы:
- window.showMessage, кажется, создан, но консоль JS говорит, что это не функция, хотя я проверил дерево dom и убедился, что переменная содержит функцию.
- Кажется, мне всегда нужно добавлять "окно".префикс, так как переменная создается в объекте окна.Это довольно серьезная проблема, заставляющая пользователей писать так каждый раз, когда они хотят вызвать функцию, действительно утомительно.
Если кто-нибудь знает решение этих проблем (или альтернативный подход к достижению того, что я пытаюсь сделать), я был бы очень рад услышать.Заранее спасибо.