Вопрос

Я взял пример таблицы ячейки из Руководство разработчика Google и внесли следующие изменения:

  • Используйте наложения вместо Java Pojos
  • Используйте EditTextCell, чтобы редактировать один столбец

Для моего удивления, при запуске кода таблица ячейки добавляет дополнительное свойство к наложенным объектам. Они должны выглядеть как:

{"Имя": "Джон", "Адрес": "123 Четвертая дорога"} {"name": "mary", "адрес": "222 Lancer Lane"}

Но вместо этого они выглядят как:

{"имя": "Джон", "Адрес": "123 Четвертая дорога", "$ h": 1} {"name": "mary", "адрес": "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)).

В вашем случае это связано с тем, что AbstractItAbleCell поддерживает карту клавиш значения для их «просмотра данных», а ваше использование (я думаю) реализации по умолчанию (SimpleProvideskey), которая непосредственно возвращает элемент.

Таким образом, при рендеринге editTextCell вызывает getViewData, который просматривает ключ на карте (и, следовательно, нуждается в хэшкоде ключа, отсюда и призыв к хашкоду), а ключ - ваш JSO (отсюда и новое свойство $ H).

Я полагаю, что предоставление реализации DeviceKey (в вас, например, возврат имени свойства) в Cltlatable решит вашу проблему.

Другие советы

Я сомневаюсь, что CellTable может ощутить от редактирования ваших JSONS. Проверьте эти наложения в Firebug/Chrome_developer_tools/... если они в порядке, то, скорее всего, ошибка в этой строке:

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

Есть как минимум две проблемы для JSONObject.toString: Передача списка в/из JSNI работает в веб -режиме, но не сбои в размещенном режиме & tostring () и jsni.
Во втором выпуске есть комментарий Согласно которому вы можете попробовать:

GWT.log( (String) new JSONObject(contact) );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top