2012-11-01 81 views
3

我想創造型GWT:創建相關jsarray

Name(
{title : "Mr.",firstname : "Bill",lastname : "Gates"}, 
{title : "Mr.",firstname : "Bill",lastname : "Gates"}, 
{title : "Mr.",firstname : "Bill",lastname : "Gates"} 
) 

的JS數組所以基本上我想創建相關陣列。 所有的例子都像轉換JavaScript數組到Java,但在我的情況下,我想另一種方式。我將從java中填充這個數組。

JSArrayJsMixedArray似乎這樣做,但我可以弄清楚如何添加到他們。

+0

爲什麼需要這個?您可以使用java地圖 – texasbruce

+0

我必須將它傳遞給外部js庫 – mvairavan

回答

4

一種方法可以是使用JSNI method創建項目/你的陣列的條目/圖如下:

JsArray arr = JavaScriptObject.createArray().cast(); 
arr.push(newEntry("Mr.", "Bill", "Gates"));  

.... 

private final native JavaScriptObject newEntry(String title, 
           String firstname, String lastname)/*-{ 
    return {title: title, firstname: firstname, lastname: lastname}; 
}-*/; 

您也可以嘗試去創造你心目中使用JSON實用的數據結構方法:將JSONObjects放入JSONArray

+0

這就是我所做的幾乎,但是隻是有一個JSNI方法,我擴展了JavaScriptObject類並創建了我自己的數據結構類,並將其添加到JsArray'JsArray persons = JavascriptObject.createArray()。cast(); persons.push((personJs)JavaScriptObject.createObject().set(fname,age,...));' – mvairavan

+0

也應該有效!可能LOC的時間更長,但你的方法應該更適合重構等等,因爲它是'更多的Java'。你爲什麼給你的JSO寫'personJs'而不是'PersonJs'? – mxro

+0

其實它的輸入錯誤:) – mvairavan

0

變量$wnd.v將包含一個對象數組。 注意:您將需要找到一種方法來將Java對象轉換爲JSON(我使用restygwt)。

class PersonList { 
    List<Person> list; 
} 

class Person { 
    String title; 
    String firstName; 
    String lastName; 

    public Person() {} 

    public Person(String title, String firstName, String lastName) { 
     this.title = title; 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 
} 


public class Main implements EntryPoint { 

    public interface PersonCodec extends JsonEncoderDecoder<PersonList> { 
    } 

    PersonCodec personCodec = GWT.create(PersonCodec.class); 

    public void onModuleLoad() { 
     List<Person> list = new ArrayList<Person>(); 

     list.add(new Person("Mr.", "Bill", "Gates")); 
     list.add(new Person("Mr.", "Andrey", "Mormysh")); 

     PersonList personList = new PersonList(); 
     personList.list = list; 

     String json = personCodec.encode(personList).toString(); 

     setPersonList(json); 
    } 


    public static native void setPersonList(String personListJson)/*-{ 
     $wnd.v = eval("(" + personListJson + ")").list; 
     alert($wnd.v[0].firstName); // Output: 'Bill' 
    }-*/; 
} 
+0

我發現直接擴展javascriptObject類並將其添加到JsArray中,如下面的答案中提到的似乎更容易 – mvairavan

0

您可以創建從Java空JavaScriptObject,但你不能從那裏進行填充,所以使用力的黑暗面:

private native JavaScriptObject putString(JavaScriptObject jso, String key, String value)/*-{ 
    jso[key] = value; 
    return jso; 
}-*/; 

private native JavaScriptObject putObject(JavaScriptObject jso, String key, JavaScriptObject value)/*-{ 
    jso[key] = value; 
    return jso; 
}-*/; 

void someJavaFunction() { 
    JavaScriptObject fromJava = JavaScriptObject.createObject(); 
    fromJava = putString(fromJava, "foo", "bar"); 
    fromJava = putObject(fromJava, "baz", fromJava); 
}