2013-07-02 24 views
0

我正在使用JSNI傳遞一些參數到GWT應用程序,到目前爲止我已設法傳遞一個簡單的字符串數組(JsArrayString),但我想傳遞一個關聯數組不知道如何與鍵提取數據(我已經成功地傳遞數組到GWT應用程序,但無法解析它),這樣的:GWT:使用JSNI解析JavaScript關聯數組JsArrayString

public static native void exportFunction() /*-{ 
    $wnd.myFunction = 
     $entry(@com.mypackage.client.HelloWorld::helloWorld(Lcom/google/gwt/core/client/JsArrayString;)); 
}-*/;  

var associative = { "hello" : "world", "goodbye" : "world" }; 
window.myFunction(associative); 

public static void helloWorld(JsArrayString strings) { 
    // String value = strings.get("hello") 
} 

我發現a topic這與我正在嘗試做的事情相反,但無法弄清楚如何做到這一點。

回答

2

沒有什麼像JS中的「關聯數組」你在說什麼是對象JsArrayString表示您期望僅包含字符串的JS數組。 JS對象在GWT中表示爲JavaScriptObject,並且沒有內置的簡單方法來動態訪問它們的屬性。

如果你知道你需要訪問屬性,你最好創建一個JavaScriptObject子類,也被稱爲an overlay type

public class MyObj extends JavaScriptObject { 
    protected MyObj() { /* required by GWT */ } 

    public final native String getHello() /*-{ return this.hello }-*/; 
    public final native String getGoodbye() /*-{ return this.goodbye }-*/; 
} 

… 

public static void helloWorld(MyObj strings) { 
    String value = strings.getHello(); 
} 

如果你不知道是什麼屬性的對象必須與希望發現他們動態的,那麼你可以用一個JavaScriptObjectcom.google.gwt.json.client.JSONObject,但它的可讀性,並創建虛假短暫的對象:

public static void helloWorld(JavaScriptObject strings) { 
    JSONObject o = new JSONObject(strings); 
    // Beware: will throw if there's no "hello" property in the object 
    String value = o.get("hello").isString().stringValue(); 
} 

好的,我說謊,有一種簡單的內置方式,但它是實驗性的(可能會損壞),並且只能在現代瀏覽器中工作。不是IE 9及以下版本,可能不是Opera 12及更低版本):您可以使用elemental.js.util.JsMapFromStringTo和類似的類。

+0

正是我所需要的!我知道我需要訪問哪些屬性,所以第一個解決方案完美無缺:)謝謝! – enp4yne