GXT 3动态更新treeStore中的元素

时间:2015-01-09 15:54:26

标签: gwt gxt

我目前正在使用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);

但显示永远不会更新。任何线索?

1 个答案:

答案 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);

希望这可以帮到你。