3.5.5.2. 标准操作

框架提供了一些标准操作用于处理常见任务,例如为表格中选择的实体调用编辑界面。通过在 type 属性中指定其类型,就可以在界面 XML 描述中声明标准操作,例如:

有两种类型的标准操作:

  • 列表操作,处理展示在表格或者树中的实体集合,CreateActionEditActionViewActionRemoveActionAddActionExcludeActionRefreshActionExcelActionBulkEditAction

    当表格、树或者数据网格添加了列表操作之后,可以从组件的右键菜单或者预定义的快捷键调用这些操作。通常也会使用添加在按钮面板的一个按钮调用操作。

    1. <groupTable id="customersTable">
    2. <actions>
    3. <action id="create" type="create"/>
    4. ...
    5. <buttonsPanel>
    6. <button id="createBtn" action="customersTable.create"/>
    7. ...
  • 选取器控件操作, 处理空间的内容,LookupActionOpenActionOpenCompositionActionClearAction

    当选取器控件添加了操作之后,自动使用控件内嵌的按钮进行操作。

    1. <pickerField id="customerField">
    2. <actions>
    3. <action id="lookup" type="picker_lookup"/>
    4. ...

每个标准操作都通过一个使用了 @ActionType("<some_type>") 注解的类实现。该类定义了操作的默认属性和行为。

可以通过制定基本操作的 XML 属性来覆盖通用的属性:caption、icon、shortcut 等。示例:

  1. <action id="create" type="create" caption="Create customer" icon="USER_PLUS"/>

从 CUBA 7.2 开始,标准操作带有额外的参数可以在 XML 进行设置或者在 Java 中用 setter 方法进行设置。在 XML 中,使用嵌套的 <properties> 元素设置额外的属性,其中每个 <property> 元素对应一个操作类中的 setter 方法:

  1. <action id="create" type="create">
  2. <properties>
  3. <property name="openMode" value="DIALOG"/>
  4. <property name="screenClass" value="com.company.demo.web.CustomerEdit"/>
  5. </properties>
  6. </action>

在 Java 控制器也可以做同样的设置:

  1. @Named("customersTable.create")
  2. private CreateAction createAction;
  3. @Subscribe
  4. public void onInit(InitEvent event) {
  5. createAction.setOpenMode(OpenMode.DIALOG);
  6. createAction.setScreenClass(CustomerEdit.class);
  7. }

如果一个 setter 接受功能接口参数,可以在界面控制器安装一个处理方法。比如,CreateActionsetAfterCommitHandler(Consumer) 方法,设置一个处理方法会在创建的实体提交之后调用。那么可以按照下面的方式提供处理器:

  1. @Install(to = "customersTable.create", subject = "afterCommitHandler")
  2. protected void customersTableCreateAfterCommitHandler(Customer entity) {
  3. System.out.println("Created " + entity);
  4. }

所有的操作都有一个通用的 enabledRule 处理器,可以根据不同的情景设置操作的 “启用” 状态。下面的例子中,对某些实体禁用了 RemoveAction:

  1. @Inject
  2. private GroupTable<Customer> customersTable;
  3. @Install(to = "customersTable.remove", subject = "enabledRule")
  4. private boolean customersTableRemoveEnabledRule() {
  5. Set<Customer> customers = customersTable.getSelected();
  6. return canBeRemoved(customers);
  7. }

参考下面的章节了解框架提供的操作详情。参考 自定义操作类型 章节了解如何创建自己的操作类型或重载已有的操作类型。