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();
}
现在,可以在一个编辑界面界面中创建和编辑两个关联的实体。