Pregunta

He tomado el ejemplo de la Tabla Móvil desde de Google para desarrolladores guiar y realizado los siguientes cambios:

  • Uso superpone en lugar de Java POJO
  • Utilice un EditTextCell a editar una columna

Para mi sorpresa, cuando se ejecuta el código de la celda de tabla es la adición de una propiedad adicional a la superposición de objetos empujó en ella. Que debe ser similar:

{ "name": "John", "dirección": "123 Cuarto Camino"} { "Name": "María", "dirección": "222 Lancer Lane"}

Pero en vez de eso se parecen a:

{ "name": "John", "dirección": "123 Cuarto Camino", "$ H": 1} { "Name": "María", "dirección": "222 Lancer Lane", "$ H": 2}

Este es el código modificado que demuestra el 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());
        }
    }

}

He comprobado que es la columna editable el que causa el problema. Si quito que la mesa no modifica mis superposiciones.

De todos modos, este es un comportamiento muy extraño. No me siento que es seguro para el trabajo con superposiciones si sus widgets les pueden añadir propiedades inesperadas.

¿Alguien ha encontrado con este problema antes o está documentado este comportamiento en cualquier lugar? ¿Alguna pista para resolverlo?

Muchas gracias

¿Fue útil?

Solución

La respuesta correcta a este problema se publicó en el foro de desarrollo GWT ( enlace ):

La propiedad $ H proviene de la implementación de JavaScriptObject # hashCode () (en com.google.gwt.cire.client.impl.Impl # GetHashCode (Objeto)).

En su caso, esto se debe a AbstractEditableCell mantener un mapa de teclas de valor a su "visión" de datos, y su utilización (supongo) del defecto aplicación ProvidesKey (SimpleProvidesKey), que directamente Devuelve el elemento.

Así, al visualizarse, el EditTextCell getViewData llamadas, que busca la clave en el mapa (y por lo tanto necesita de la código hash de la clave, por lo tanto, la llamada a hashCode), y la clave es su JSO (De ahí la nueva propiedad $ H).

Creo que da una ProvidesKey aplicación (en files, volviendo la propiedad de nombre, por ejemplo) a la CellTable resolvería el problema.

Otros consejos

dudo que CellTable puede editar sus escondidas JSONs. Compruebe las superposiciones en Firebug / Chrome_Developer_Tools / ... si bien lo más probable error está en esta línea:

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

Hay al menos dos problemas para JSONObject.toString: al pasar lista a / desde JSNI funciona en modo web, pero falla en el modo alojado y toString () y JSNI .
En segundo problema existe href="http://code.google.com/p/google-web-toolkit/issues/detail?id=4301#c3" acuerdo al que se puede probar esto:

GWT.log( (String) new JSONObject(contact) );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top