Передача обратного вызова функции JSNI в GWT - PullRequest
0 голосов
/ 02 июля 2019

В моем приложении GWT встроен фрейм с другим веб-приложением (не на этот раз GWT).Ожидается, что это встроенное приложение сможет вызывать некоторые API в моем родительском приложении следующим образом:

window.parent.f(function(result) { console.log("Result == " + result); });

Как мне объявить функцию JSNI, которая может принимать эту функцию в качестве параметра?

private static final void f(Consumer<String> onsuccess) {
    onsuccess.accept("abcd");
}

public static native void installApi() /*-{
    $wnd.f = function(onsuccess) {
        @my.package.client.Example::f(...); // What goes in here?
    }
}-*/;

1 Ответ

1 голос
/ 02 июля 2019

Посмотрите на JsInterop.В настоящее время это лучший и самый простой способ взаимодействия между Java и JavaScript в GWT.

http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJsInterop.html

Кроме того, существуют ограничения безопасности, когда Iframe загружается из другого домена / порта.

Вызов функции родительского окна из iframe

РЕДАКТИРОВАТЬ: Попробуйте это:

@JsType(name = "Foo", namespace = JsPackage.GLOBAL)
public class Foo {
    @JsFunction
    public interface Callback {
        public abstract void onCallback(String msg);
    }

    public void test(Callback callback) {
        GWT.log("Message from Java");
        callback.onCallback("Massage passed from Java");
    }
}

И вызовите это по:

var foo = new $wnd.Foo();
foo.test(function(msg) {
    console.log("Message from JavaScript");
    console.log("Received: " + msg);
});

И самое главное, что он скрыт в документах, вам нужно добавить эту опцию для компиляции и параметров режима superdev.

-generateJsInteropExports
...