我正在尝试使用JSNI(gwt' s javacript接口)来设置/获取js对象的变量:这样的窗口:
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设置为window:
var var_1={"id":"id_1","name":"name_1"}
set("key_1",var_1)
然后
get("key_1")
我会正确地获得var_1
然后将另一个变量var_2设置为window
var var_2={"id":"id_2","name":"name_2"}
set("key_2",var_2)
然后,再次尝试获取key_1
get("key_1")
意外地,将返回var_2
所以,问题很明显:get()函数总是会返回最后一个set变量,无论是什么键。问题是:
1,Why?
2,How to make it right?
答案 0 :(得分:1)
更改为
后private final native <T> T get(String key)/*-{
return $wnd[key];
}-*/;
private final native void set(String key, Object value)/*-{
$wnd[key] = value;
}-*/;
现在设定并按预期工作。
答案 1 :(得分:0)
您不需要为此处理JSNI,您已经在Element
类中使用了一些有用的方法,因此只需将对象Window
强制转换为元素即可。< / p>
此代码应该有效:
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 ...)