2014-11-02 59 views
2

我想使用JSNI(GWT的javacript接口)來設置/獲取變量/從JS對象:窗口,像這樣:相當於如何使用JavaScript將變量正確存儲到窗口?

private final native <T> T get(String key)/*-{ 
    return $wnd.key; 
}-*/; 


private final native void set(String key, Object value)/*-{ 
    $wnd.key = value; 
}-*/; 

///// JS們會喜歡這個

function get(String key){ 
    return window.key; 
} 


function set(String key, var value){ 
    window.key = value; 
} 

如果我設置一個變量:VAR_1到窗口:

var var_1={"id":"id_1","name":"name_1"} 
set("key_1",var_1) 

然後

get("key_1") 

我會得到VAR_1正確

,然後設置另一個變量VAR_2到窗口

var var_2={"id":"id_2","name":"name_2"} 
set("key_2",var_2) 

然後,嘗試獲得key_1再次

get("key_1") 

意外,VAR_2將返回

所以,問題很明顯:get()函數將始終返回最後一個設置可變不管鍵is.Questions是什麼:

1,Why? 
2,How to make it right? 

回答

1

更改爲

private final native <T> T get(String key)/*-{ 
    return $wnd[key]; 
}-*/; 


private final native void set(String key, Object value)/*-{ 
    $wnd[key] = value; 
}-*/; 

都設置後及目前預計得到的工作。

+0

好像你證明在JS中,點符號細化總是字面的,而通過「[]」運算符的細化會導致可變的分辨率。我不知道這種語言的細節 - 謝謝。 – 2014-11-02 18:20:40

0

您不需要爲此處理JSNI,您在Element類中已經有了一些有用的方法,因此只需將對象Window投射到一個元素即可。

此代碼應工作:

Element window = ScriptInjector.TOP_WINDOW.cast(); 

window.setPropertyJSO("key_jso", JsArray.createArray()); 
JavaScriptObject jso = window.getPropertyJSO("key_jso") 

window.setPropertyBoolean("key_boolean", true); 
boolean b = window.getPropertyBoolean("key_boolean") 

// and the same with: 
// setPropertyDouble, getPropertyDouble 
// setPropertyInt, getPropertyInt 
// setPropertyString, getPropertyString 
// setPropertyObject, getPropertyObject 

如果使用gwtquery,我建議總是在任何GWT項目導入庫,你可以簡單地做:

import static com.google.gwt.query.client.GQuery.*; 

$(window).prop("key", value); 
boolean b = $(window).prop("key"); 
// or 
boolean b = $(window).prop("key", Boolean.class); 
// And the same with any type (JavaScriptObject, Double, Integer ...)