我使用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。我建议你先研究一下。
如果您有列表编辑器,我还将研究它是否适合您的应用程序,用Grid
或IronList
/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
方法,只需等到美国东部时间明晚。到那时我会把代码整理好,并相应地更新这篇文章。