0

我必须将包含 JavaScriptObjects 的 JavaScript-Arrays 保存到 html5 存储中。这些 JavaScriptObject 的数量在数组中是多样化的。当我从存储中读出保存的 JavaScripts 数组时,我想显示这些数组中包含的 JavaScriptObjects。为此,我需要这些数组的长度,但这是不可能的,因为我收到错误“返回的不是 int 以外的东西”,但仅当我收到 html 存储的内容时。如果我将对象放入数组并读取之后的长度,它的工作方式类似于示例:

JsArray<Person> persons = JavaScriptObject.createArray().cast();
person.push(person1);
person.push(person2);
person.length();    // <---- this works

首先是我的 JavaScript 对象

public class Person extends JavaScriptObject{

protected Person(){}

    final public native void setName(String name)/*-{
         this.name = name;
    }-*/;   

    final public native String getName()/*-{
       return this.name;
    }-*/;
 }

这就是我将对象放入 JsArray 并将其保存到存储中的方式

JsArray<Person> persons = JavaScriptObject.createArray().cast();
Person person = JavaScriptObject.createObject().cast();
person.setName("FirstName");
person.setLastname("LastName");
persons.push(person);

// create more person objects 2 - 3 and adding tham into the person array
persons.push(person2);
persons.push(person3);

// now save this array into storage
if(Storage.isSupported()){
    storage = Storage.getLocalStorage();
    storage.setItem("1",  new JSONObject(persons).toString());  
}

现在我想从保存在存储中的数组中读出人员对象。

  JsArray<Person> persons;

  if(Storage.isSupported()){
     storage = Storage.getLocalStorage();

      System.out.println("storage length : "+storage.getLength());  // <---- works gives 1

      for(int i = 0; i < storage.getLength(); i++){
           int keynr = i+1;
           String key = String.valueOf(keynr);
           persons = JavaScriptObject.createArray().cast();
           array =  JsonUtils.safeEval(storage.getItem(key)); // receiving the saved array from storage

           array.get(0).getFirstName();   // works it showes the name
           array.length();  // doesnt work
     }

}

我收到以下错误消息:

com.google.web.bindery.event.shared.UmbrellaException:捕获异常:捕获异常:捕获异常:从 JSNI 方法 '@com.google.gwt.core.client.JsArray::length( )': JS 值,类型为 undefined,预期为 int

那么为什么在接收到存储的数据后就无法得到数组的长度呢?我做这一切的方式是否正确?请帮助找到解决方案。

4

1 回答 1

0

我改变了它,它现在可以工作了!

  1. 将 JsArray 保存到存储中

         storage.setItem("1",  new JSONArray(array).toString());
    

2.从存储中读取该数组

private JsArray<Person> array = JavaScriptObject.createArray().cast();

JSONValue jsonValue = JSONParser.parseStrict(storage.getItem(key)); // key is 1

JSONArray jsonArray = jsonValue.isArray();

for(int j = 0; j < jsonArray.size(); j++){
     JSONObject object = jsonArray.get(j).isObject();
     Person person = (Person) object.getJavaScriptObject();
     person.getName();
}
于 2014-01-16T20:30:00.537 回答