2014-11-02 58 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 ...)