添加新项时DataProvider未自动刷新,如何解决?
问题原因
你当前的DataProvider是基于数据库查询返回的静态集合快照创建的。DataProvider.ofCollection(technologyList)只会绑定传入的集合实例,当你新增数据到数据库后,内存里的technologyList并没有同步更新新数据,调用refreshAll()只是通知组件重新渲染现有集合的内容,自然看不到新添加的项。而修改现有项时refreshItem(item)有效,是因为你修改的是集合中已存在的对象实例,组件能感知到实例的变化。
解决方案
有两种常用的修复方式,根据你的业务场景选择:
方式一:维护动态可更新的底层集合
初始化时使用可修改的集合(比如ArrayList)创建ListDataProvider,新增数据时同时更新集合并通知刷新:
// 初始化阶段 List<Technology> technologyList = new ArrayList<>(technologyService.findAllTechnologies()); ListDataProvider<Technology> dataProvider = new ListDataProvider<>(technologyList); // 新增数据保存后的逻辑 Technology newTech = // 从表单获取的新对象 technologyService.save(newTech); // 保存到数据库 dataProvider.getItems().add(newTech); // 将新对象添加到DataProvider的底层集合 dataProvider.refreshAll(); // 通知网格刷新
方式二:重新查询数据库并替换集合
如果不想维护内存中的集合,每次新增后重新查询数据库,替换DataProvider的数据源:
// 新增数据保存后的逻辑 technologyService.save(newTech); // 保存到数据库 List<Technology> updatedList = technologyService.findAllTechnologies(); // 重新查询 dataProvider.getItems().clear(); dataProvider.getItems().addAll(updatedList); dataProvider.refreshAll();
额外提示
如果你的框架支持更高级的DataProvider实现(比如基于数据库查询的动态DataProvider),也可以直接使用这类实现,它会自动处理数据的增删改查同步,无需手动维护集合。
内容的提问来源于stack exchange,提问作者spozzi
相关产品推荐
相关产品推荐

