删除

RemoveAction 是一个 列表操作,支持从 UI 的数据容器和数据库中删除实体实例。

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

属性

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

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

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

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

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

<action id="remove" type="remove">
    <properties>
        <property name="confirmation" value="true"/>
        <property name="confirmationTitle" value="Removing customer..."/>
        <property name="confirmationMessage" value="Do you really want to remove the customer?"/>
    </properties>
</action>
<action id="removeAction" type="remove"/>

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

@Named("custTable.remove")
private RemoveAction<Customer> removeAction;

@Subscribe
public void onInit(InitEvent event) {
    removeAction.setConfirmation(true);
    removeAction.setConfirmationTitle("Removing customer...");
    removeAction.setConfirmationMessage("Do you really want to remove the customer?");
}

处理器

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

afterActionPerformedHandler

在选中实体删除之后调用。接收 event 对象作为参数,可以用来获取要删除的实体。示例:

@Install(to = "custTable.remove", subject = "afterActionPerformedHandler")
private void custTableRemoveAfterActionPerformedHandler(RemoveOperation.AfterActionPerformedEvent<Customer> event) {
    System.out.println("Removed " + event.getItems());
}

actionCancelledHandler

当用户在确认窗口取消删除操作时会调用。接收 event 对象,可以用来获取要删除的实体。示例:

@Install(to = "custTable.remove", subject = "actionCancelledHandler")
private void custTableRemoveActionCancelledHandler(RemoveOperation.ActionCancelledEvent<Customer> event) {
    System.out.println("Cancelled");
}

使用 ActionPerformedEvent

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

@Named("custTable.remove")
private RemoveAction<Customer> removeAction;

@Subscribe("custTable.remove")
public void onCustTableRemove(Action.ActionPerformedEvent event) {
    removeAction.setConfirmation(false);
    dialogs.createOptionDialog()
            .withCaption("My confirm dialog")
            .withMessage("Do you really want to remove the customer?")
            .withActions(
                    new DialogAction(DialogAction.Type.YES)
                            .withHandler(e -> removeAction.execute()), // execute action
                    new DialogAction(DialogAction.Type.NO)
            )
            .show();
}

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

@Autowired
private RemoveOperation removeOperation;
@Subscribe("custTable.removeAction")
public void onCustTableRemoveAction(Action.ActionPerformedEvent event) {
    removeOperation.builder(custTable)
            .withConfirmationTitle("Removing customer...")
            .withConfirmationMessage("Do you really want to remove the customer?")
            .remove();
}