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 オブジェクトはJavaScriptObjectGWT では として表され、それらのプロパティに動的にアクセスするための組み込みの簡単な方法はありません。

アクセスする必要があるプロパティがわかっている場合は、オーバーレイ タイプ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();
}

オブジェクトが持つプロパティがわからず、それらを動的に検出したい場合は、 aJavaScriptObjectを 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();
}

OK、私は嘘をつきました、簡単な組み込みの方法がありますが、それは実験的 (そしておそらく壊れている) であり、最新のブラウザーでのみ動作するように設計されています (つまり、IE 9 以下ではなく、おそらく Opera 12 以下では動作しません): 使用できますelemental.js.util.JsMapFromStringToおよび類似のクラス。

于 2013-07-02T12:24:17.360 に答える