3.5.5.2.12. RemoveAction

RemoveAction 是 列表操作 设计用来从 UI 的数据容器移除实体实例,同时从数据库删除。

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

下列参数可以通过 XML 或 Java 的方式设置:

  • confirmation - boolean 值,配置是否需要在移除选中实体之前展示确认对话框。默认为 true。

  • confirmationMessage - 确认窗口的消息。默认从主消息包的 dialogs.Confirmation.Remove 键值获取。

  • confirmationTitle - 确认窗口标题。默认从主消息包的 dialogs.Confirmation 键值获取。

比如,希望展示特殊的确认消息,可以在 XML 中如下配置:

  1. <action id="remove" type="remove">
  2. <properties>
  3. <property name="confirmation" value="true"/>
  4. <property name="confirmationTitle" value="Removing customer..."/>
  5. <property name="confirmationMessage" value="Do you really want to remove the customer?"/>
  6. </properties>
  7. </action>

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

  1. @Named("customersTable.remove")
  2. private RemoveAction customersTableRemove;
  3. @Subscribe
  4. public void onInit(InitEvent event) {
  5. customersTableRemove.setConfirmation(true);
  6. customersTableRemove.setConfirmationTitle("Removing customer...");
  7. customersTableRemove.setConfirmationMessage("Do you really want to remove the customer?");
  8. }

现在我们看看那些只能用 Java 代码配置的参数。如果要为这些参数生成带正确注解的方法桩代码,可以用 Studio 中 Component Inspector 工具窗口的 Handlers 标签页功能。

  • afterActionPerformedHandler - 在选中实体移除之后调用的处理器。接收事件对象,可以用来获取那些选中要移除的实体。示例:

    1. @Install(to = "customersTable.remove", subject = "afterActionPerformedHandler")
    2. protected void customersTableRemoveAfterActionPerformedHandler(RemoveOperation.AfterActionPerformedEvent<Customer> event) {
    3. System.out.println("Removed " + event.getItems());
    4. }
  • actionCancelledHandler - 当用户在确认窗口取消移除操作时会调用的方法。接收事件对象,可以用来获取那些选中要移除的实体。示例:

    1. @Install(to = "customersTable.remove", subject = "actionCancelledHandler")
    2. protected void customersTableRemoveActionCancelledHandler(RemoveOperation.ActionCancelledEvent<Customer> event) {
    3. System.out.println("Cancelled");
    4. }

如果需要在该操作执行前做一些检查或者与用户做一些交互,可以订阅操作的 ActionPerformedEvent 事件并按需调用操作的 execute() 方法。操作会使用你为它定义的所有参数进行调用。下面的例子中,我们在执行操作前展示了一个确认对话框:

  1. @Named("customersTable.remove")
  2. private RemoveAction customersTableRemove;
  3. @Subscribe("customersTable.remove")
  4. public void onCustomersTableRemove(Action.ActionPerformedEvent event) {
  5. customersTableRemove.setConfirmation(false);
  6. dialogs.createOptionDialog()
  7. .withCaption("My fancy confirm dialog")
  8. .withMessage("Do you really want to remove the customer?")
  9. .withActions(
  10. new DialogAction(DialogAction.Type.YES)
  11. .withHandler(e -> customersTableRemove.execute()), // execute action
  12. new DialogAction(DialogAction.Type.NO)
  13. )
  14. .show();
  15. }

另外,还可以先订阅 ActionPerformedEvent,但是不调用操作的 execute() 方法,而是直接使用 RemoveOperation API 移除选中的实体。此时,会忽略所有的操作参数和行为,只能用其通用参数,比如 caption, icon 等。示例:

  1. @Inject
  2. private RemoveOperation removeOperation;
  3. @Subscribe("customersTable.remove")
  4. public void onCustomersTableRemove(Action.ActionPerformedEvent event) {
  5. removeOperation.builder(customersTable)
  6. .withConfirmationTitle("Removing customer...")
  7. .withConfirmationMessage("Do you really want to remove the customer?")
  8. .remove();
  9. }