具有覆盖类型问题的 GWT 单元小部件
- 使用覆盖层而不是 Java POJO
- 使用 EditTextCell 编辑一列
令我惊讶的是,在运行代码时,单元格表向推入其中的覆盖对象添加了一个额外的属性。它们应该看起来像:
{"name":"John", "address":"123 Fourth Road"} {"name":"Mary", "address":"222 Lancer Lane"}
但它们看起来像:
{"name":"John", "address":"123 Fourth Road", "$H":1 } {"name":"Mary", "address":"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());
}
}
}
我已经检查过它是导致该问题的可编辑列问题。如果我删除它,表格不会修改我的叠加层。
无论如何,这是一种非常奇怪的行为。如果您的小部件可以添加意外的属性,我认为使用覆盖层是不安全的。
以前有人遇到过这个问题吗?或者这个行为是否记录在任何地方?有什么提示可以解决吗?
多谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
此问题的正确答案已发布在 GWT 开发论坛中(链接):
The correct answer to this issue was posted in the GWT development forum (link):
我怀疑 CellTable 可以偷偷地编辑你的 JSON。检查 Firebug/Chrome_Developer_Tools/... 中的这些覆盖层,如果正常,则最有可能的错误在这一行:
JSONObject.toString
至少有两个问题: 将列表传递至/from JSNI 在 Web 模式下工作,但在托管模式下失败 & toString() 和 JSNI。在第二期中,有评论,根据你可以尝试这个:
I doubt that CellTable can sneakily edit your JSONs. Check those overlays in Firebug/Chrome_Developer_Tools/... if they ok then most likely bug is in this line:
There are atleast two issues for
JSONObject.toString
: Passing List to/from JSNI works in web mode but fails in hosted mode & toString() and JSNI.In second issue there is comment according to which you can try this: