7.1.2.5. 用单一编辑界面处理一对一组合
在一个编辑界面中编辑 One-to-One 组合通常很方便。我们看看以下示例如何实现编辑 Customer 和 CustomerDetails 一对一关系。
-
customer-edit.xml 描述包含主数据源
customerDs
和嵌套数据源detailsDs
:<dsContext> <datasource id="customerDs" class="sample.entity.Customer" view="customer-view"> <datasource id="detailsDs" property="details"/> </datasource> </dsContext>
两个实体需要编辑的所有字段都被分到同一个
fieldGroup
,其中一些字段被绑定到嵌套数据源:<fieldGroup id="customerGroup" datasource="customerDs"> <column width="200px"> <field property="name"/> <field property="email"/> <field datasource="detailsDs" property="address" rows="3"/> <field datasource="detailsDs" property="note" rows="3"/> </column> </fieldGroup>
-
在 CustomerEdit 控制器中重写
initNewItem()
方法,创建一个CustomerDetails
实例,并将此示例关联到刚创建的Customer
实例:@Inject private Metadata metadata; @Override protected void initNewItem(Customer customer) { customer.setDetails(metadata.create(CustomerDetails.class)); }
最后,处理用户单击 Create 然后想要关闭编辑界面而不修改任何内容的情况。该用户将被要求保存更改,因为
detailsDs
数据源已经包含一个空实例,AbstractEditor
的isModified()
方法将始终返回true
。为避免出现确认对话框,应该让isModified()
方法仅关注主数据源中的更改:@Override public boolean isModified() { return customerDs.isModified(); }
现在,可以在一个编辑界面界面中创建和编辑两个关联的实体。