Вызов методов GWT из рукописного Javascript - PullRequest
1 голос
/ 20 октября 2011

Я создаю веб-приложение с 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 и убедился, что переменная содержит функцию.
  • Кажется, мне всегда нужно добавлять "окно".префикс, так как переменная создается в объекте окна.Это довольно серьезная проблема, заставляющая пользователей писать так каждый раз, когда они хотят вызвать функцию, действительно утомительно.

Если кто-нибудь знает решение этих проблем (или альтернативный подход к достижению того, что я пытаюсь сделать), я был бы очень рад услышать.Заранее спасибо.

1 Ответ

1 голос
/ 20 октября 2011

Вам нужно проделать дополнительную работу. Потому что описанный вами метод работает только во время компиляции. После компиляции имена методов GWT исчезают, потому что они запутаны. Но есть библиотека, которая может помочь вам в этом: gwt-exporter

...