我目前正在使用GXT 3来显示树中的元素。 这些元素是从数据库中检索出来的,并通过它们的id在树中标识(我的意思是id是我商店的ModelKeyProvider)。 我还使用户可以使用以下代码在树中本地创建对象:
private Tree<EntityDAO, String> tree;
private TreeStore<EntityDAO> store;
int count = 1;
// instanciation and irrelevant stuff
...
EntityDAO sel = tree.getSelectionModel().getSelectedItem();
EntityDAO child = new EntityDAO();
child.setId((long) count);
store.add(store.getParent(sel), child);
count++;
tree.setExpanded(sel, true);
tree.getSelectionModel().select(child, false);
如您所见,我为我的本地对象设置了一个临时id(count)。 将对象保存在数据库中时会出现此问题。然后将永久ID设置为我的EntityDAO但是当我尝试将此id设置为我的本地对象以将其与数据库同步时,它不起作用。 我试图直接修改子ID
child.setId(result);
tree.update(child);
我尝试使用正确的ID添加我的对象的副本,然后从树中删除我的对象
EntityDAO newPR = child;
newPR.setId(result);
store.add(store.getParent(child), newPR);
store.remove(child);
但显示永远不会更新。任何线索?
答案 0 :(得分:1)
让我们讨论您尝试的第一种方法,即更新方法:
child.setId(result);
tree.update(child);
从更新方法API说明:
替换与给定项目的键匹配的项目,然后触发 StoreUpdateEvent表示发生了此更改。任何 通过它的记录实例对先前模型的更改将丢失 并且记录将被删除。这不会导致排序或过滤 重新应用于对象。覆盖:在Store中更新(...) 参数:将新项目设置为在商店中取代。
基本上,update方法将替换商店内与您的参数具有相同键的项目。您的数据具有商店内不存在的新密钥,这就是为什么它不会对您的树形显示产生任何影响。
其次,让我们讨论创建对象的副本并使用正确的id设置它:
EntityDAO newPR = child;
newPR.setId(result);
store.add(store.getParent(child), newPR);
store.remove(child);
这种方法实际上会起作用,但你只有一个小问题。代码的第一行实际上只是为您提供了一个引用旧对象(子对象)的变量,因此每当您删除子进程时,newPR也会被删除。你应该使用构造函数创建一个新对象,在这里我认为你应该这样做:
EntityDAO newPR = new EntityDAO();
newPR.setId(result);
newPR.setOtherProperty(child.getOtherProperty());
// just copy all property of child to newPR
store.add(store.getParent(child), newPR);
store.remove(child);
希望这可以帮到你。