Vaadin更改嵌套布局中的值



我使用Vaadin 14,并且知道是否可以向主视图中的对象报告嵌套列表中的更改。

图片中显示了一个粗略的例子。在上面你可以看到大小的总和(这里是2(,如果我按Delete,它应该会变为1。这可能吗?怎么可能?

概念

我还没有任何代码,我想对可能发生的事情有一个提示,例如观察者模式之类的,但代码可能看起来像这样代码:

@Rout("")
public class MainView extends VerticalLayout {
 private List<CustomDetails> customDetails = new ArrayList<>();
 public MainView(){
  final var form = new FormLayout();
  customDetails.forEach(form::add);
  add(H1("Header"), form)
 }
}
public class CustomDetails extends Details{
 private CustomForm customForm;
 private final Service service;
 public CustomDetails(){
  customForms = new CustomForm(service.getListOfObjects());
  this.setContent(customForms)
 }
}
public class CustomForm extend FormLayout{
 private FormLayout formLayout = new FormLayout();
 private List<Object> objects = new LinkedList<>();
 public CustomForm(List<Object> list){
 
  this.objects = list;
  setUp();
  add(new Paragraph("SUM: "+ list.size()), layout);
 }
 private void setUp(){
  objects.forEarch(o->{
   ....
   layout.add(...)
  })
 }
}

在Vaadin中有一个实用程序类Binder,用于将数据绑定到表单。如果你的用例与此相关,即你所谓的嵌套布局实际上是一个表单,而你引用的对象是你想要绑定到该表单中的数据bean。我建议你先研究一下。

如果您有列表编辑器,我还将研究它是否适合您的应用程序,用GridIronList/VirtualList来实现它,后者由DataProvider支持。假设您编辑了一个项目,保存该项目后,您可以调用dataProvider.refreshItem(item)来更新视图。

观察者模式或其他。。。

是的,这是一个解决方案。这是一项艰巨的工作,以前也做过。

Beanbag就是这样一个图书馆。

注:这是我写的(或者更确切地说,我是一天前开始写的(。

编辑:

截至本次编辑,我们有ObservableCollection接口。你可以这样使用:

// You have a collection called "strings".
// Wrap it in an ObservableCollection.
final ObservableCollection<String, Collection<String>, BasicObservableCollection.Default<String, Collection<String>>> observableStrings = ObservableCollections.observableCollection(strings);
// Add a removed observer.
observableStrings.addElementRemovedObserver(observation -> System.out.println(""" + observation.getValue() + "" was removed.");
// Remove an element.
observableStrings.remove("hello");

如果您需要包装器具有List方法,只需等到美国东部时间明晚。到那时我会把代码整理好,并相应地更新这篇文章。

最新更新