打开关联实体

ExcludeAction 是一个 列表操作,支持打开一个浏览界面展示关联实体列表。关联实体的加载会考虑用户对实体、实体属性以及界面的权限。

展示关联实体列表的浏览界面需要包含过滤器组件。

该操作通过 io.jmix.ui.action.list.RelatedAction 类实现,在 XML 中需要使用操作属性 type="related" 定义。可以用 action 元素的 XML 属性定义通用的操作参数,参阅 声明式操作 了解细节。下面我们介绍 RelatedAction 类特有的参数。

属性

下列参数可以在 XML 或 Java 中设置:

  • openMode - 查找界面的打开模式,是 OpenMode 枚举类型的值:NEW_TABDIALOG 等。默认情况下,RelatedActionTHIS_TAB 模式打开查找界面。

  • screenId - 查找界面的字符串 id。RelatedAction 默认会使用带有 @PrimaryLookupScreen 注解的界面,或标识符为 <entity_name>.browse 格式的界面,例如,demo_Customer.browse

  • screenClass - 查找界面控制器的 Java 类。比 screenId 有更高的优先级。

  • property - 实体属性,需要为此属性展示关联实体。

  • configurationName - 为打开界面的过滤器设置标题。

示例,需要以对话框方式打开一个特定的查找界面,可以在 XML 中这样配置操作:

<action id="related" type="related">
    <properties>
        <property name="property" value="favouriteBrands"/>
        <property name="openMode" value="DIALOG"/>
    </properties>
</action>

或者,可以在界面控制器注入该操作,然后用 setter 配置:

@Named("customersTable.related")
private RelatedAction relatedAction;

@Subscribe
public void onInit(InitEvent event) {
    relatedAction.setOpenMode(OpenMode.DIALOG);
    relatedAction.setProperty("favoriteBrands");
}

处理器

下面了解这些只能用 Java 配置的参数。用 Studio 能为这些参数正确生成带注解的方法。

screenOptionsSupplier

返回 ScreenOptions 对象,返回值可以传递给打开的查找界面。示例:

@Install(to = "customersTable.related", subject = "screenOptionsSupplier")
private ScreenOptions customersTableRelatedScreenOptionsSupplier() {
    return new MapScreenOptions(ParamsMap.of("someParameter", 10));
}

返回的 ScreenOptions 对象可以在打开界面的 InitEvent 中使用。

screenConfigurer

接收查找界面作为参数并能在打开之前初始化界面。示例:

@Install(to = "customersTable.related", subject = "screenConfigurer")
private void customersTableRelatedScreenConfigurer(Screen screen) {
    ((BrandBrowse) screen).setSomeParameter(10);
}

注意,界面 configurer 会在界面已经初始化但是还未显示时生效,即在界面的 InitEventAfterInitEvent 事件之后,但是在 BeforeShowEvent 之前。

afterCloseHandler

在查找界面关闭后调用的处理器。AfterCloseEvent 事件会传递给该处理器。示例:

@Install(to = "customersTable.related", subject = "afterCloseHandler")
private void customersTableRelatedAfterCloseHandler(AfterCloseEvent afterCloseEvent) {
    System.out.println("Closed with " + afterCloseEvent.getCloseAction());
}

使用 ActionPerformedEvent

还可以先订阅 ActionPerformedEvent,但是不调用操作的 execute() 方法,而是使用 RelatedEntitiesBuilder API 直接打开浏览界面。示例:

@Subscribe("customersTable.related")
public void onCustomersTableRelated(Action.ActionPerformedEvent event) {
    RelatedEntitiesBuilder builder = relatedEntitiesSupport.builder(this);
    Screen brandBrowser = builder
            .withMetaClass(metadata.getClass(Customer.class))
            .withProperty("favoriteBrands")
            .withSelectedEntities(customersTable.getSelected())
            .withConfigurationName("See favourite brands")
            .build();
    brandBrowser.show();
}