3.5.3.4.1. 声明式创建数据组件

为界面创建数据组件的最简单方法就是在界面的 XML 描述中的 <data> 元素中进行声明式的定义。

考虑包含 CustomerOrderOrderLine 实体的数据模型。Order 实体的编辑界面可以用下面的 XML 定义:

  1. <data> (1)
  2. <instance id="orderDc" class="com.company.sales.entity.Order"> (2)
  3. <view extends="_local"> (3)
  4. <property name="lines" view="_minimal">
  5. <property name="product" view="_local"/>
  6. <property name="quantity"/>
  7. </property>
  8. <property name="customer" view="_minimal"/>
  9. </view>
  10. <loader/> (4)
  11. <collection id="linesDc" property="lines"/> (5)
  12. </instance>
  13. <collection id="customersDc" class="com.company.sales.entity.Customer" view="_minimal"> (6)
  14. <loader> (7)
  15. <query><![CDATA[select e from sales_Customer e]]></query>
  16. </loader>
  17. </collection>
  18. </data>

这个例子中,会创建下列数据组件:

1- DataContext 实例。
2- Order 实体的 InstanceContainer
3- 容器内实体实例的内联 view。内联视图也可以继承共享视图(定义在 views.xml)。
4- 加载 Order 实例的 InstanceLoader
5- 加载内嵌实体 OrderLinesCollectionPropertyContainer ,是绑定到 Order.lines 属性的实体。
6- 加载 Customer 实体的 CollectionContainerview 属性可以绑定某个共享视图。
7- CollectionLoader 使用指定的查询加载 Customer 实体。

数据容器可以在可视化组件中这样使用:

  1. <layout>
  2. <dateField dataContainer="orderDc" property="date"/> (1)
  3. <form id="form" dataContainer="orderDc"> (2)
  4. <column>
  5. <textField property="amount"/>
  6. <lookupPickerField id="customerField" property="customer"
  7. optionsContainer="customersDc"/> (3)
  8. </column>
  9. </form>
  10. <table dataContainer="linesDc"> (4)
  11. <columns>
  12. <column id="product"/>
  13. <column id="quantity"/>
  14. </columns>
  15. </table>
1单独的控件具有 dataContainerproperty 属性。
2form 会将 dataContainer 传递给 form 的字段,所以字段只需要 property 属性。
3查找字段有 optionsContainer 属性。
4表格只有 dataContainer 属性。