3.5.3.4.1. 声明式创建数据组件

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

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

<data> (1)
    <instance id="orderDc" class="com.company.sales.entity.Order"> (2)
        <view extends="_local"> (3)
            <property name="lines" view="_minimal">
                <property name="product" view="_local"/>
                <property name="quantity"/>
            </property>
            <property name="customer" view="_minimal"/>
        </view>

        <loader/> (4)

        <collection id="linesDc" property="lines"/> (5)
    </instance>

    <collection id="customersDc" class="com.company.sales.entity.Customer" view="_minimal"> (6)
        <loader> (7)
            <query><![CDATA[select e from sales_Customer e]]></query>
        </loader>
    </collection>
</data>

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

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

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

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