打开关联实体
属性
下列参数可以在 XML 或 Java 中设置:
-
openMode
- 查找界面的打开模式,是OpenMode
枚举类型的值:NEW_TAB
、DIALOG
等。默认情况下,RelatedAction
用THIS_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 会在界面已经初始化但是还未显示时生效,即在界面的 InitEvent
和 AfterInitEvent
事件之后,但是在 BeforeShowEvent
之前。
使用 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();
}