JavaScriptObjects を含む JavaScript-Arrays を html5 ストレージに保存する必要があります。これらの JavaScriptObjects の数は、配列内で多様化しています。保存された JavaScript 配列をストレージから読み取るときに、これらの配列に含まれる JavaScriptObject を表示したいと考えています。これを行うには、これらの配列の長さが必要ですが、「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: 例外がキャッチされました: 例外がキャッチされました: 例外がキャッチされました: int 以外の何かが JSNI メソッドから返されました '@com.google.gwt.core.client.JsArray::length( )': 型未定義の JS 値、予想される int
では、ストレージのデータを受け取った後に配列の長さを取得できないのはなぜですか? 私がそれをすべてやっている方法は正しいですか?解決策を見つけるのを手伝ってください。