Frage

Ich habe das Zelltischbeispiel aus genommen Google Developer's Guide und nahm die folgenden Änderungen vor:

  • Verwenden Sie Overlays anstelle von Java -Pojos
  • Verwenden Sie eine EditTextCell, um eine Spalte zu bearbeiten

Für meine Überraschung fügt die Zelltabelle beim Ausführen des Codes den Overlay -Objekten eine zusätzliche Eigenschaft hinzu. Sie sollten aussehen wie:

{"Name": "John", "Adresse": "123 Vierte Straße"} {"Name": "Mary", "Adresse": "222 Lancer Lane"}

Aber stattdessen sehen sie aus wie:

{"Name": "John", "Adresse": "123 vierte Straße", "$ H": 1} {"Name": "Mary", "Adresse": "222 Lancer Lane", "$ H": 2}

Hier ist der geänderte Code, der das Problem demonstriert:

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());
        }
    }

}

Ich habe überprüft, ob es sich um die bearbeitbare Spalte handelt, die das Problem verursacht. Wenn ich es entferne, ändert die Tabelle meine Overlays nicht.

Wie auch immer, das ist ein sehr seltsames Verhalten. Ich denke nicht, dass es sicher ist, mit Overlays zu arbeiten, wenn Ihre Widgets sie unerwartete Eigenschaften hinzufügen können.

Hat jemand dieses Problem schon einmal angetroffen oder ist dieses Verhalten irgendwo dokumentiert? Irgendwelche Hinweise, um es zu lösen?

Danke vielmals

War es hilfreich?

Lösung

Die richtige Antwort auf dieses Problem wurde im GWT -Entwicklungsforum (Verknüpfung):

Die Eigenschaft $ H stammt aus der Implementierung von JavaScriptObject#HashCode () (in com.google.gwt.cire.client.impl.impl#Gethashcode (Objekt)).

In Ihrem Fall ist dies darauf zurückzuführen, dass die AbstractEditableCell eine Karte von Wertschlüssel zu ihren "Ansichtsdaten" und Ihre Verwendung (ich denke) des Standards für die Implementierung (SimpleProvideskey), die das Element direkt zurückgibt, beibehalten.

Bei der Renderung ruft der EditTextCell GetViewData auf, der den Schlüssel auf der Karte nachgibt (und somit den HashCode des Schlüssels benötigt, daher der Anruf zum HashCode), und der Schlüssel ist Ihr JSO (daher die neue $ h -Eigenschaft).

Ich glaube, dass das Geben einer Voraussetzungen (in Ihrem Fall die Rückgabe der Namenseigenschaft) an das Cellable Ihr Problem lösen würde.

Andere Tipps

Ich bezweifle, dass Cellentable Ihre Jsons hintereinander bearbeiten kann. Überprüfen Sie diese Overlays in Firebug/Chrome_Developer_tools/... Wenn sie in Ordnung sind, ist der Wahrscheinlichkeit in dieser Zeile höchstwahrscheinlich:

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

Es gibt mindestens zwei Probleme für JSONObject.toString: Die Liste der Liste an/von JSNI funktioniert im Web -Modus, fällt jedoch im gehosteten Modus fehl & tostring () und jsni.
In der zweiten Ausgabe gibt es Kommentar nach dem Sie dies versuchen können:

GWT.log( (String) new JSONObject(contact) );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top