dataLoadCoordinator

dataLoadCoordinator facet 支持触发数据加载,以及声明式的将数据加载器和数据容器、可视化组件、视图生命周期事件进行连接。

基本用法

如需在视图的 BeforeShowEvent 事件触发所有的数据加载器,只需在视图的 XML 描述中添加 dataLoadCoordinator,其属性 auto="true"

<facets>
    <dataLoadCoordinator auto="true"/>
</facets>

工作模式

可以配置 dataLoadCoordinator 在自动、手动或半自动模式下工作。

自动模式

在自动模式(auto="true")下,dataLoadCoordinator 会在 BeforeShowEvent触发所有能提供参数值的加载器。该 facet 可以自动将加载器查询中的参数与来自容器或可视化组件的值进行匹配。如需指明来源,需要在参数名称前加上相应的前缀:使用 container_ 表示值来自容器,使用 component_ 表示值来自可视化组件。例如,名为 container_citiesDc 的参数会从 citiesDc 容器获取值。

可以使用 componentPrefixcontainerPrefix 属性更改默认前缀。

如果查询中有不带前缀的“任意参数”(例如 select e from User e where e.city = :city),则 facet 将无法匹配该参数,因此该加载器不会被自动触发。此时,必须自行设置参数值并调用 userDl.load()。在 查询条件 中添加任意参数不会阻止加载器的主查询运行。

示例:

<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://automaticModeView.title">
    <data>
        <collection id="citiesDc" class="com.company.onboarding.entity.City"> (1)
            <loader id="citiesDl" readOnly="true">
                <query>
                    <![CDATA[select e from City e]]> (2)
                    <condition>
                        <and>
                            <jpql>
                                <where>e.name like:component_nameField</where> (3)
                            </jpql>
                        </and>
                    </condition>
                </query>
            </loader>
            <fetchPlan extends="_base"/>
        </collection>
        <collection id="customersDc"
                    class="com.company.onboarding.entity.Customer">
            <loader id="customersDl" readOnly="true">
                <query>
                    <![CDATA[
                    select e from Customer e
                    where e.city = :container_citiesDc]]> (4)
                </query>
            </loader>
            <fetchPlan extends="_base"/>
        </collection>
    </data>
    <facets>
        <dataLoadCoordinator auto="true"/> (5)
    </facets>
    <layout>
        <textField id="nameField"/> (6)
    </layout>
</view>
1 数据容器 – 持有 City 实体。其值用作 :container_citiesDc 参数。
2 城市查询 – 不包含参数,将在 BeforeShowEvent 时执行。
3 查询条件 – 当用户在 nameField 中输入值时,会附加到城市查询中。
4 客户查询 – 每当 citiesDc 容器中的选中值发生变化时,重新加载 Customer 行。
5 Facet 设置为自动模式 – 自动协调加载器的执行,确保查询以正确的顺序运行。
6 输入字段nameField 文本组件,其值绑定到城市查询中的 :component_nameField

手动模式

在手动模式(auto = false)下,facet 不再执行任何自动操作。必须指定触发加载器的确切视图事件(例如 InitEvent),并指定每个查询参数的来源,无论是组件值还是容器值。这些详细信息放置在 facet 声明中的 <refresh> 元素提供。

示例:

<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://manualModeView.title">
    <data>
        <collection id="citiesDc" class="com.company.onboarding.entity.City"> (1)
            <loader id="citiesDl" readOnly="true">
                <query>
                    <![CDATA[select e from City e]]> (2)
                    <condition>
                        <and>
                            <jpql>
                                <where>e.name like:name</where> (3)
                            </jpql>
                        </and>
                    </condition>
                </query>
            </loader>
            <fetchPlan extends="_base"/>
        </collection>
        <collection id="customersDc"
                    class="com.company.onboarding.entity.Customer">
            <loader id="customersDl" readOnly="true">
                <query>
                    <![CDATA[
                    select e from Customer e
                    where e.city = :city]]> (4)
                </query>
            </loader>
            <fetchPlan extends="_base"/>
        </collection>
    </data>
    <facets>
        <dataLoadCoordinator auto="false"> (5)
            <refresh loader="citiesDl">
                <onViewEvent type="Init"/>
                <onComponentValueChanged component="nameField"
                                         likeClause="CASE_INSENSITIVE"
                                         param="name"/> (6)
            </refresh>
            <refresh loader="customersDl">
                <onContainerItemChanged container="citiesDc"
                                        param="city"/> (7)
            </refresh>
        </dataLoadCoordinator>
    </facets>
    <layout>
        <textField id="nameField"/> (8)
    </layout>
</view>
1 数据容器 – 持有 City 实体。其值用作客户查询中的 city 参数。
2 城市查询 – 不包含参数,将根据手动配置在 InitEvent 时执行。
3 查询条件 – 当用户在 nameField 中输入值时,会附加到查询中。
4 客户查询 – 每当 citiesDc 容器中的选中值发生变化时,重新加载 Customer 实例。
5 手动 facet 模式 – 加载由 <refresh> 元素中定义的规则控制。
6 城市加载器刷新条件 – 在 InitEvent 以及 nameField 组件的内容发生变化时触发 citiesDl 刷新,将其输入作为 name 参数传递。
7 客户加载器刷新条件 – 当 citiesDc 容器中的选中项发生变化时触发 customersDl 刷新,将该城市作为 city 参数传递。
8 输入字段nameField 文本组件,其值通过 <refresh> 元素绑定到城市查询。

半自动模式

Facet 还可以设置为半自动模式。在此模式下,协调器会自动触发加载器(auto = "true"), 也会同时遵循添加的任何手动规则。

示例:

<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://semiautomaticModeView.title">
    <data>
        <collection id="citiesDc" class="com.company.onboarding.entity.City">
            <loader id="citiesDl" readOnly="true">
                <query>
                    <![CDATA[select e from City e]]>
                </query>
            </loader>
            <fetchPlan extends="_base"/>
        </collection>
        <collection id="customersDc"
                    class="com.company.onboarding.entity.Customer">
            <loader id="customersDl" readOnly="true">
                <query>
                    <![CDATA[
                    select e from Customer e
                    where e.city = :container_citiesDc]]>
                </query>
            </loader>
            <fetchPlan extends="_base"/>
        </collection>
    </data>
    <facets>
        <dataLoadCoordinator auto="true"> (1)
            <refresh loader="citiesDl">
                <onViewEvent type="Ready"/> (2)
            </refresh>
        </dataLoadCoordinator>
    </facets>
    <layout>

        // ...

    </layout>
</view>
1 Facet 设置为半自动模式 – facet 将自动触发加载器,除非被手动规则覆盖。
2 城市加载器刷新条件 – 指定当视图触发 ReadyEvent 时,应触发 citiesDl 加载器。

属性

在 Jmix Studio 可以使用 Jmix UI 组件属性面板查看和编辑 facet 属性。

  • auto - 定义 dataLoadCoordinator 的工作模式。 默认为 false

  • componentPrefix - 定义 可视化组件 引用参数的前缀,自动模式下,DataLoadCoordinator 从参数定义的组件中获取参数值。默认值为 component_

  • containerPrefix - 定义 数据容器 引用参数的前缀,自动模式下,DataLoadCoordinator 从参数定义的容器中获取参数值。默认值为 container_

refresh 元素

refresh 元素支持为数据加载器定义刷新的条件。

该元素的唯一属性是 loader,定义加载器的 id

refresh 元素可以有下列内部的元素,用于定义触发条件:

  1. onComponentValueChanged - 当可视化组件的值改变时触发加载器。有下列属性:

    • component - 指定可视化组件的 id

    • likeClause - 如果在 查询条件 中使用 like 表达式,可以定义下面三种搜索模式之一:

      • NONE - 默认值。

      • CASE_SENSITIVE - 大小写敏感。

      • CASE_INSENSITIVE - 大小写不敏感。

    • param - 指定查询参数名称。

  2. onContainerItemChanged - 当数据容器中的内容改变时触发加载器。有下列属性:

    • container - 指定数据容器的 id

    • param - 指定查询参数名称。

  3. onViewEvent - 在视图生命周期事件中触发加载器。有下列属性:

    • type - 定义视图事件的类型,可能值:

      • Init - 在 InitEvent 事件中触发。

      • BeforeShow - 在 BeforeShowEvent 事件中触发。

      • Ready - 在 ReadyEvent 事件中触发。

参考

通过下面的在线示例了解 dataLoadCoordinator 的实际用法: