如何在GWT中为$ wnd [x]分配JSONObject或JavaScriptObject?

时间:2012-07-08 22:05:00

标签: javascript json gwt jsni

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

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

必须有一种更简单的方法吗?!我只想说:$ wnd [“test”] = myJsonObject

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

2 个答案:

答案 0 :(得分: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'];
}-*/

答案 1 :(得分:1)

这是我的GWT词典版本(真正的动态语言切换):

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

那就是它!