使用JsInterop包装简单的JavaScript插件

时间:2016-03-31 08:35:11

标签: javascript gwt gwt2

我目前正将 Gwt 2.7 项目升级到 2.8-beta1 ,我正在尝试重构来自 JSNI 的Javascript插件包装器到 JsInterop

这里是JSNI包装器:

public class MyPlugin extends JavaScriptObject {

    protected MyPlugin(){
    }

    public static native MyPlugin init(MyPluginConfig config) /*-{
        return new $wnd.MyPlugin(config);
    }-*/;

    public final native void addItem(MyPluginItem item) /*-{
        this.addItem(item);
    }-*/;

    public final native void setEnable(int itemIndex, boolean enable) /*-{
        this.setEnable(itemIndex, enable);
    }-*/;
}

我尝试了什么:

@JsType(namespace = JsPackage.GLOBAL, isNative = true)
public class MyPlugin {
    public static native MyPlugin init(MyPluginConfig config);
    public native void addItem(MyPluginItem item);
    public native void setEnable(int itemIndex, boolean enable);
}

问题,我不知道如何包装构造函数。 在JsInterop doc

  

原生的@JsType类只能拥有       公共原生方法,       公共和未初始化的领域,       空构造函数,       最终的非本机方法,不会覆盖任何其他方法,

所以,这是我的问题:如何在JsInterop中将JS构造函数看起来像var myPlugin = MyPlugin({option1 : value1, option2 : value2,...});的JavaScript插件包装在哪里?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:3)

好的,我找到了解决方案。

只需声明一个带有参数和空内容的构造函数:

@JsType(namespace = JsPackage.GLOBAL, isNative = true)
public class MyPlugin {
    public MyPlugin(MyPluginConfig config) {} //<--- here
    public native void addItem(MyPluginItem item);
    public native void setEnable(int itemIndex, boolean enable);
}

它有效。

希望它可以帮助其他人:)

编辑:MyPluginConfig结构

MyPluginConfig只是一个POJO类。

@JsType(namespace = JsPackage.GLOBAL, isNative = true, name = "Object")
public class MyPluginConfig {
    @JsProperty public void setXXXX(String str);
    @JsProperty public String getXXXX();
    ...
}