2011-10-07 8 views
0

Je crée une version GWT d'une bibliothèque Java qui prend en charge le javax.script.ScriptEngine pour évaluer les fonctions dynamiquement via Javascript, par exemple,lier des valeurs aux variables mentionnées dans un script

o => o % 2 == 0 

où au runtime, la valeur de "o" est définie via le javax.script.Bindings (la partie o => est dépourvue bien sûr).

Le problème est, comment puis-je obtenir le même effet de GWT? J'utilise une fonction native

native Object nativeEval(String script) /*-{ 
    return $wnd.eval(script); 
}-*/ 

nativeEval("o % 2 == 0"); 

Mais comment puis-je lier une valeur à l'identificateur "o"?

Répondre

0
new Function("o", "return (" + expressionThatUsesO + ")")(o) 

Si expressionThatUsesO est "o % 2" alors cela équivaut à une fonction globale qui est appelée immédiatement

(function (o) { return o % 2; })(o) 

Pour référence, https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function:

new Function ([arg1[, arg2[, ... argN]],] functionBody) 

Paramètres

arg1, arg2, ... argN

Noms à utiliser par la fonction en tant que noms d'arguments formels. Chacun doit être une chaîne qui correspond à un identifiant JavaScript valide ou une liste de ces chaînes séparées par une virgule; par exemple "x", "theValue" ou "a,b".

functionBody

Chaîne contenant les instructions JavaScript comprenant la définition de fonction.

0

Pour transmettre des valeurs à l'identifiant "o":

public native void define(String handle, Object o) /*-{ 
    eval("var " + handle+ "="+ o); 
}-*/; 
public native boolean nativeEval(String script) /*-{ 
    return eval(script); 
}-*/; 

Et puis l'appeler:

String script = "o % 2 == 0"; 
define("o",2); 
Window.alert(nativeEval(script)+""); 
define("o",3); 
Window.alert(nativeEval(script)+""); 
+0

Votre solution fonctionne uniquement avec les types qui ont une représentation de chaîne significative. Et je ne suis pas sûr que le premier var aura le même contexte que le second eval? – akarnokd

+0

Pouvez-vous me donner un exemple de type sans représentation de chaîne significative? Oui, ils ont le même contexte – pistolPanties

0

Je suppose que je trouve une solution:

import javax.script.bindings.Bindings; 
import javax.script.bindings.SimpleBindings; 

int bindSequence; 

native void prepareOnWindow(int index) /*-{ 
    $wnd["mylib_bindings_" + index] = new Array(); 
}-*/; 
native void setOnWindow(int index, String name, Object value) /*-{ 
    $wnd["mylib_bindings_" + index][name] = value; 
}-*/; 
native void clearOnWindow(int index) /*-{ 
    $wnd["mylib_bindings_" + index] = null; 
}-*/; 
native Object invoke(String script) /*-{ 
    var result = $wnd.eval(script); 
    if (typeof(result) == "boolean") { 
     return result ? @java.lang.Boolean::TRUE : @java.lang.Boolean::FALSE; 
    } else 
    if (typeof(result) == "number") { 
     return @java.lang.Double::valueOf(D)(result); 
    } 
    return result; 
}-*/; 
public Object invoke(String script, Bindings bindings) { 
    int seq = bindSequence++; 
    try { 
     StringBuilder script2 = new StringBuilder(); 
     prepareOnWindow(seq); 
     for (Map.Entry<String, Object> e : bindings.entrySet()) { 
      setOnWindow(seq, e.getKey(), e.getValue()); 
      script2.append("var ").append(e.getKey()).append(" = ") 
      .append("window[\"mylib_bindings_\" + ").append(seq) 
      .append("][\"").append(e.getKey()).append("\"];\r\n"); 
     } 
     script2.append("\r\n").append(script); 
     return invoke(script); 
    } finally { 
     clearOnWindow(seq); 
    } 
} 

void testing() { 
    Bindings b = new SimpleBindings(); 

    b.put("o", 1); 

    Window.alert(invoke("o", b).toString()); 

    b.put("o", "Hello world"); 

    Window.alert(invoke("o", b).toString()); 

    b.put("o", 2); 

    Window.alert(invoke("o % 2 == 0", b).toString()); 
} 

L'idée est pour définir les paires nom-valeur sur un objet communément accessible, tel que window et modifiez le script pour en extraire les variables. Afin de permettre un appel entrant ré-entrant, les liaisons sont stockées sous un numéro de séquence en augmentation constante.

Questions connexes