0

varGWT ディクショナリを使用して HTML ページからいくつかを読みました。は次のvarようになります。

var test = {
    "a" : "123",
    "b" : "jg34l",
    ...
}

これで、JS 変数の新しいコンテンツを AJAX-Call 経由で取得できます。現時点では、次のように上書きします。

public native void set(String key, String value) /*-{
    $wnd["test"][key] = value;
}-*/;

public void onResponseReceived(Request request, Response response) {
    JSONObject obj = (JSONObject) JSONParser.parseLenient(response.getText());

    for (String key : obj.keySet()) {
        JSONString val = (JSONString) obj.get(key);
        set(key, val.stringValue());
    }
}

ご覧のとおり、JSON-String を取得します。それを解析します。JSONObject にキャストします。すべてのキーと値のペアを取得し、JSNI メソッドを使用してペアを設定します。

これを行うためのより簡単な方法があるはずです?! 簡単に言いたい: $wnd["test"] = myJsonObject

これはパフォーマンスが重要なステップなので、助けてください (最大 1000 のキーと値のペア)。

4

2 に答える 2

1

これが私のバージョンの GWT Dictionary (真の動的言語スイッチ) です。

public native void setTranslation(String locale, JavaScriptObject translationData) /*-{
    $wnd[locale] = translationData;
}-*/

@Inject
TranslationProvider translationProvider;

public void onResponseReceived(Request request, Response response) {
    String newLocale = "en";
    JavaScriptObject translationData = JsonUtils.unsafeEval(response);
    setTranslation(newLocale, translationData);
    translationProvider.setLocale(newLocale);
    LocaleChangeEvent.fire(eventBus);
}

翻訳可能なテキストを表示するすべてのウィジェットは、以下に登録しLocaleChangeEventて実装しLocaleChangeEventHandlerます。

public interface LocaleChangeEventHandler extends EventHandler {
    void onLocaleChange(LocaleChangeEvent event);
}

メソッドでは、クラスからメソッドをonLocaleChange呼び出してその文字列を受け取るだけです。get(...)TranslationProvider

public class LocaleAwareLabel extends Label implements LocaleChangeEventHandler {
    TranslationProvider translationProvider;

    @Inject
    public LocaleAwareLabel(TranslationProvider translationProvider, EventBus eventBus) {
        this.translationProvider = translationProvider;
        eventBus.addHandler(LocaleChangeEvent.TYPE, this);
        get();
    }

    public void get() {
        this.setText(translationProvider.get("myDictionaryKey"));
    }

    @Override
    public void onLocaleChange(LocaleChangeEvent event) {
        get();
    }
}

そしてここでTranslationProviderクラス:

@Singleton
public class TranslationProvider {
    Dictionary dictionary;

    public void setActiveLocale(String locale) {
        dictionary = Dictionary.getDictionary(locale);
    }

    public String get(String key) {
        dictionary.get(key);
    }
}

それでおしまい!

于 2012-07-09T20:33:44.223 に答える
1

JSOを使用してみることができます(よりもはるかに高速である必要がありますJSONObject)

public native void set(JavaScriptObject data) /*-{
   $wnd['test'] = data;
}-*/;

public void onResponseReceived(Request request, Response response) {
    JavascriptObject data = JsonUtils.safeEval(response.getText()).case();
    set(data);
}

自分で試したことがないので、100%うまくいくとは言えません。

更新: Dictionary の代わりに、ハッシュのようなアクセスをサポート
する を直接返すことができます。JavaScriptObject

public class MyDictionary extends JavaScriptObject {

    public native String get(String name) /*-{
        return this[name];
    }-*/;
}

public native MyDictionary getData() /*-{
   return $wnd['test'];
}-*/
于 2012-07-09T13:49:16.733 に答える