如何使用javascript正确地将变量存储到窗口?

时间:2014-11-02 05:52:17

标签: javascript gwt

我正在尝试使用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?

2 个答案:

答案 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 ...)