2016-03-31 3 views
2

Je suis en train d'améliorer mon GWT 2.7 projet à 2,8 beta1 et je suis en train de factoriser l'emballage plugin Javascript de JSNI à JsInterop.Wrap plugin simple JavaScript à l'aide JsInterop

Ici l'emballage 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); 
    }-*/; 
} 

Ce que j'ai essayé:

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

Le problème, je ne sais pas comment envelopper le constructeur. Dans le JsInterop doc

Une classe @JsType native ne peut avoir méthodes indigènes publiques, champs publics et non initialisées, vide constructeur, méthodes non indigènes finales qui ne l'emporte pas sur d'autres méthodes,

Alors, voici ma question: Comment envelopper un plugin JavaScript où dans le JS constructeur ressemble à var myPlugin = MyPlugin({option1 : value1, option2 : value2,...}); JsInterop?

Merci pour l'aide :)

Répondre

3

Ok, j'ai trouvé la solution.

Juste un constructeur avec déclarer le contenu params et vide:

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

Et ça marche.

espère que cela aide d'autres personnes :)

EDIT: Structure MyPluginConfig

MyPluginConfig est juste une classe POJO.

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

Pouvez-vous partager votre structure de code MyPluginConfig? J'essaye de passer des options à mon wrapper, mais c'est cassant. – xybrek

+0

Bonjour pouvez-vous partager? – xybrek

+0

@xybrek. devrait fonctionner: ' @JsType (isNative = true, espace de noms = JsPackage.GLOBAL) public class MyPluginConfig { public String option1; public int option2; } ' ' MyPluginConfig config = nouveau MyPluginConfig(); config.option1 = "option de chaîne de caractères"; config.option2 = 101; MyPlugin plugin = nouveau MyPlugin (config); ' – user3233853