Domanda

Mi sono preso la tabella di esempio cellulare da google dello sviluppatore guidare e apportato le seguenti modifiche:

  • Usa si sovrappone al posto di Java POJO
  • Usa un EditTextCell per modificare una colonna

Per la mia sorpresa, quando si esegue il codice della cella di tabella è l'aggiunta di una proprietà in più per la sovrapposizione oggetti spinto in esso. Dovrebbero assomigliare a:

{ "name": "John", "indirizzo": "123 Quarto Road"} { "Name": "Maria", "indirizzo": "222 Lancer Lane"}

Ma invece assomigliano:

{ "name": "John", "indirizzo": "123 Quarto Road", "$ H": 1} { "Name": "Maria", "indirizzo": "222 Lancer Lane", "$ H": 2}

Ecco il codice modificato che dimostra il problema:

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

}

Ho controllato che è la colonna modificabile quello che causa il problema. Se rimuovo che la tabella non modifica i miei sovrapposizioni.

In ogni caso, questo è un comportamento molto strano. Non mi sento è sicuro di lavoro con le sovrapposizioni, se i widget possono aggiungere le proprietà inaspettate.

Qualcuno ha riscontrato questo problema prima o è questo comportamento documentato da nessuna parte? Eventuali suggerimenti per risolverlo?

Grazie mille

È stato utile?

Soluzione

La risposta corretta a questo problema è stata pubblicata nel forum di sviluppo GWT ( link ):

La proprietà $ H deriva dal implementazione di JavaScriptObject # hashCode () (in com.google.gwt.cire.client.impl.Impl # GetHashCode (Object)).

Nel vostro caso, ciò è dovuto alla AbstractEditableCell mantenendo una mappa di chiavi valore ai loro "dati di vista", e l'utilizzo (credo) di quello predefinito implementazione ProvidesKey (SimpleProvidesKey) che direttamente restituisce la voce.

Così, quando il rendering, l'EditTextCell chiama getViewData, che guarda il chiave nella mappa (e deve quindi il hashcode della chiave, quindi la chiamata a hashCode), e la chiave è il vostro JSO (Da qui la nuova proprietà $ H).

Credo che dare un ProvidesKey implementazione (in voi caso, il ritorno la proprietà nome per esempio) al Celltable avrebbe risolto il problema.

Altri suggerimenti

dubito che CellTable può subdolamente modificare i tuoi JSONs. Controllare quelle sovrapposizioni in Firebug / Chrome_Developer_Tools / ... se ok allora molto probabilmente bug è in questa linea:

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

Ci sono due questioni atleast per JSONObject.toString: Passando elenco da / per JSNI funziona in modalità web, ma non riesce in modalità hosted & toString () e JSNI .
Nella seconda edizione c'è href="http://code.google.com/p/google-web-toolkit/issues/detail?id=4301#c3" secondo a cui si può provare questo:

GWT.log( (String) new JSONObject(contact) );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top