2012-07-08 40 views
0

我使用GWT Dictionary從我的HTML-Page中讀取了一些varvar看起來像這樣:

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

現在我通過AJAX調用新的內容爲我的JS變種。目前,我重寫這樣的:

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個鍵值對)。

回答

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']; 
}-*/ 
+0

是的這個作品,謝謝。但它有問題與GWT詞典:(字典不承認,有新的價值。用我的方法從上面它的作品,我認爲我必須以某種方式「重新加載」字典 – 2012-07-09 18:45:02

+0

你是什麼意思與「字典doesn 't認識到有新的價值「?順便說一句,你也可以在字典中使用JSO – 2012-07-09 22:01:03

+0

問題是:例如,以下代碼在我的HTML文件中:'var test = {...}'然後我使用'Dictionary dict = Dictionary.getDictionary(「test」)'獲取'test'的內容,然後用''wnd ['test'] = jso;'用'JavaScriptObject jso'替換'test'的內容。 :''dict.get(「key」)''返回舊值,BUT:'alert($ wnd ['test'] ['key'])'返回新的值。我的方法從我的帖子上面看,一切都按預期工作,看到我的帖子下面的解決方案(很簡單:不要覆蓋'$ wnd ['test']',而是創建一個新的'var'並使用它。) – 2012-07-10 02:50:54

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方法是簡單地從TranslationProvider類調​​用get(...)方法來接收它的字符串:

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

這就是它!

相關問題