質問

セルテーブルの例を撮りました Google開発者ガイド 次の変更を加えました。

  • Java Pojosの代わりにオーバーレイを使用します
  • EdittextCellを使用して、1つの列を編集します

驚いたことに、コードを実行するとき、セルテーブルは、それに押し込まれたオーバーレイオブジェクトに追加のプロパティを追加しています。彼らは次のように見えるはずです:

{"name": "John"、 "dresder": "123 Fourth Road"} {"name": "Mary"、 "dresder": "222 Lancer Lane"}

しかし、代わりに彼らは次のように見えます:

{"name": "john"、 "address": "123 fourth road"、 "$ h":1} {"name": "mary"、 "address": "222 Lancer Lane"、 "$ h": " 2}

これが問題を示す修正コードです。

import java.util.Arrays;
import java.util.List;

import com.google.gwt.cell.client.EditTextCell;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.user.cellview.client.CellTable;
import com.google.gwt.user.cellview.client.Column;
import com.google.gwt.user.cellview.client.TextColumn;
import com.google.gwt.user.client.ui.RootPanel;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class Overlay implements EntryPoint {

    private static class Contact extends JavaScriptObject {

        protected Contact() {}

        public static native Contact create(String name, String address) /*-{
            return {"name" : name , "address" : address};
        }-*/;
        public final native String getName() /*-{
            return this["name"];
        }-*/;   
        public final native void setName(String name) /*-{
            this["name"] = name;
        }-*/;
        public final native String getAddress() /*-{
            return this["address"];
        }-*/;   
        public final native void setAddress(String address) /*-{
            this["address"] = address;
        }-*/;
    }

    private static List<Contact> CONTACTS = Arrays.asList(
            Contact.create("John", "123 Fourth Road"),
            Contact.create("Mary", "222 Lancer Lane"));

    /**
     * This is the entry point method.
     */
    public void onModuleLoad() {

        CellTable<Contact> table = new CellTable<Contact>();
        // Create name column.
        Column<Contact, String> nameColumn = new Column<Contact, String>(new EditTextCell()) {
            public String getValue(Contact object) {
                return object.getName();
            }
        };
        // Create address column.
        TextColumn<Contact> addressColumn = new TextColumn<Contact>() {
            public String getValue(Contact contact) {
                return contact.getAddress();
            }
        };
        // Add the columns.
        table.addColumn(nameColumn, "Name");
        table.addColumn(addressColumn, "Address");      
        table.setRowCount(CONTACTS.size(), true);
        // Push the data into the widget.
        printList();
        table.setRowData(0, CONTACTS);      
        printList();        
        RootPanel.get().add(table);
    }

    private void printList() {
        for(Contact contact : CONTACTS) {
            GWT.log(new JSONObject(contact).toString());
        }
    }

}

私はそれが編集可能な列であることを確認しました。削除した場合、テーブルはオーバーレイを変更しません。

とにかく、これは非常に奇妙な行動です。ウィジェットが予期しないプロパティを追加できる場合、オーバーレイで作業するのは安全ではないと思います。

誰かが以前にこの問題に遭遇したことがありますか、それともこの行動はどこでも文書化されていますか?それを解決するためのヒントはありますか?

どうもありがとう

役に立ちましたか?

解決

この問題に対する正解は、GWT開発フォーラムに投稿されました(リンク):

$ hプロパティは、javascriptobject#hashcode()の実装から来ています(com.google.gwt.cire.client.impl.impl#gethashcode(object))。

あなたの場合、これは、「ビューデータ」の値キーのマップを維持し、アイテムを直接返すデフォルトのsultionKey実装(SimpleProvidesKey)の使用(私が推測する)の抽象的な能力を維持するためです。

したがって、レンダリングするとき、EdittextCellはGetViewDataを呼び出します。GetViewDataは、マップ内のキーを検索します(したがって、キーのハッシュコードが必要なため、ハッシュコードへの呼び出しが必要です)。キーはJSO(したがって新しい$ Hプロパティ)です。

私は、celltableに提供されるキーの実装(あなたの場合、名前のプロパティを返す)を携帯に与えるとあなたの問題を解決すると思います。

他のヒント

CellTableがJSonsをこっそり編集できるとは思わない。 FireBug/chrome_developer_tools/でこれらのオーバーレイを確認してください。

GWT.log(new JSONObject(contact).toString());

少なくとも2つの問題があります JSONObject.toString: jsniへの渡しリストをWebモードで動作させますが、ホストモードでは失敗します & toString()およびJSNI.
第2号にはあります コメント あなたはこれを試すことができます:

GWT.log( (String) new JSONObject(contact) );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top