Question

J'ai pris l'exemple du tableau cellulaire de Google pour les développeurs guider et apporté les modifications suivantes:

  • utiliser les superpositions au lieu de Java POJO
  • Utilisez un EditTextCell pour modifier une colonne

Pour ma grande surprise, lors de l'exécution du code de la table cellulaire ajoute une propriété supplémentaire des objets à la superposition poussé en elle. Ils devraient ressembler à:

{ "name": "John", "adresse": "123 chemin Fourth"} { "Name": "Mary", "adresse": "222 Lancer Lane"}

Mais au contraire, ils ressemblent à:

{ "name": "John", "adresse": "123 chemin Fourth", "$ H": 1} { "Name": "Mary", "adresse": "222 Lane Lancer", "$ H": 2}

Voici le code modifié qui démontre la question:

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

}

J'ai vérifié qu'il est la colonne modifiable celui qui cause le problème. Si je le supprimer la table ne modifie pas mes superpositions.

De toute façon, c'est un comportement très bizarre. Je ne pense pas qu'il est sûr de travailler avec des superpositions si vos widgets peuvent les ajouter des propriétés inattendues.

Quelqu'un at-il rencontré ce problème avant ou est-ce comportement documenté nulle part? Tous les conseils pour le résoudre?

Merci beaucoup

Était-ce utile?

La solution

La bonne réponse à cette question a été publiée dans le forum de développement GWT ( lien ):

  

La propriété $ H provient de la   implémentation de   JavaScriptObject # hashCode () (en   com.google.gwt.cire.client.impl.Impl # GetHashCode (Object)).

     

Dans votre cas, cela est dû à   AbstractEditableCell maintenant une carte   des clés de la valeur à leur « vue » des données,   et votre utilisation (je suppose) de la valeur par défaut   la mise en œuvre ProvidesKey   (SimpleProvidesKey) qui directement   renvoie l'élément.

     

Ainsi, lors du rendu, le EditTextCell   appelle getViewData, qui recherche la   clé dans la carte (et doit donc la   hashcode de la clé, d'où l'appel à   hashCode), et la clé est votre JSO   (D'où la nouvelle propriété $ H).

     

Je crois que donner un ProvidesKey   la mise en œuvre (en vous cas, le retour   la propriété de nom par exemple) à la   Celltable résoudrait votre problème.

Autres conseils

Je doute que CellTable peut sournoisement modifier vos JSONs. Vérifiez les superpositions dans Firebug / Chrome_Developer_Tools / ... si ok alors bug le plus probable est dans cette ligne:

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

Il y a atleast deux questions pour JSONObject.toString: passage Liste à / de JSNI fonctionne en mode Web, mais échoue en mode hébergé et toString () et JSNI .
Dans la deuxième question, il est selon auquel vous pouvez essayer ceci:

GWT.log( (String) new JSONObject(contact) );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top