2016-03-31 11 views
2

ich bin ein Upgrade zur Zeit meines GWT 2.7 Projektes 2.8-Beta1 und ich versuche, die Javascript-Plugin Wrapper von JSNI zu JsInterop Refactoring.Wrap einfache JavaScript-Plugin JsInterop mit

Hier die JSNI Wrapper:

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); 
    }-*/; 
} 

was ich versucht habe:

@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); 
} 

Das Problem, ich habe keine Ahnung, wie der Konstruktor zu wickeln. Im JsInterop doc

Eine native @JsType Klasse kann öffentliche native Methoden nur haben, öffentliche und nicht initialisierte Felder, leeren Konstruktor, Finale nicht-native Methoden, die keine andere Methoden nicht außer Kraft setzen,

Also, das ist meine Frage: Wie eine JavaScript-Plugin wickeln, wo in der JS der Konstruktor wie var myPlugin = MyPlugin({option1 : value1, option2 : value2,...}); in JsInterop aussieht?

Vielen Dank für Hilfe :)

Antwort

3

Ok, ich fand die Lösung.

erklären nur einen Konstruktor mit params und leeren Inhalt:

@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); 
} 

Und es funktioniert.

Hoffe, dass es anderen Menschen hilft :)

EDIT: MyPluginConfig Struktur

MyPluginConfig ist nur eine POJO-Klasse.

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

Können Sie Ihre MyPluginConfig-Codestruktur freigeben? Ich versuche Optionen an meinen Wrapper zu übergeben, aber es bricht. – xybrek

+0

Hallo können Sie teilen? – xybrek

+0

@xybrek. sollte funktionieren: ' @JsType (isNative = true, namespace = JsPackage.GLOBAL) öffentliche Klasse MyPluginConfig { public String option1; öffentliche int option2; } ' ' MyPluginConfig config = neu MyPluginConfig(); config.option1 = "einige String-Option"; config.option2 = 101; MyPlugin plugin = neues MyPlugin (config); ' – user3233853