0

我正在使用 JSNI 将一些参数传递给 GWT 应用程序,到目前为止,我已经设法传递了一个简单的字符串数组(JsArrayString),但我想传递一个关联数组,但不知道如何使用键提取数据(我已设法将数组传递给 GWT 应用程序但无法解析它),如下所示:

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")
}

我发现了一个与我想做的相反的话题,但不知道该怎么做。

4

1 回答 1

2

JS 中没有像“关联数组”这样的东西。你在说的是一个对象JsArrayString表示您希望仅包含字符串的 JS 数组。JS 对象JavaScriptObject在 GWT 中表示为 s,并且没有内置的简单方法可以动态访问它们的属性。

如果您知道需要访问哪些属性,最好创建一个JavaScriptObject子类,也称为覆盖类型

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

如果您不知道对象将具有哪些属性并希望动态发现它们,那么您可以将 a 包装JavaScriptObject到 acom.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和类似的课程。

于 2013-07-02T12:24:17.360 回答