0

var我使用 GWT Dictionary 从我的 HTML 页面中读取了一些内容。var看起来像这样:

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

现在我通过 AJAX-Call 为我的 JS var 获取新内容。目前我像这样覆盖它:

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 字符串。解析它。将其转换为 JSONObject。获取每个键值对并使用 JSNI 方法设置对。

必须有更简单的方法来做到这一点?!我只想说: $wnd["test"] = myJsonObject

请帮助我,因为这是性能关键步骤(最多 1000 个键值对)。

4

2 回答 2

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%是否有效。

更新:您可以直接返回支持散列访问
的而不是字典: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 回答
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 回答