将回调传递给GWT中的JSNI函数

时间:2019-07-02 10:09:35

标签: gwt jsni

我的GWT应用程序设计为将一个iframe嵌入其中的另一个Web应用程序(这次不是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 个答案:

答案 0 :(得分:1)

查看JsInterop。这是目前在GWT中Java和JavaScript之间进行通讯的最佳和最简便的方法。

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

此外,从其他域/端口加载iframe时,存在安全限制。

Calling a parent window function from an 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