我使用GWT Dictionary从我的HTML页面中读取了一些var
。 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-String。解析它。将其强制转换为JSONObject。获取每个键值对并使用JSNI方法设置对。
必须有一种更简单的方法吗?!我只想说:$ wnd [“test”] = myJsonObject
请帮助我,因为它是性能关键步骤(最多1000个键值对)。
答案 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);
}
}
那就是它!