视图方法
在本节中,我们将介绍一些可以在代码中调用或重写的视图控制器基类的方法。
所有视图的方法
-
close()- 请求关闭视图,使用StandardOutcome枚举值或CloseAction对象作为参数。@Subscribe("discardButton") public void onDiscardButtonClick(ClickEvent<Button> event) { close(StandardOutcome.DISCARD); }参数值将传递给 BeforeCloseEvent 和 AfterCloseEvent,因此可以在监听器中获取视图关闭原因的信息。
-
closeWithDefaultAction()- 请求使用StandardOutcome.CLOSE关闭视图。
-
setPreventBrowserTabClosing()- 设置此视图是否应防止浏览器标签页意外关闭,如果设置了 jmix.ui.view.prevent-browser-tab-closing 属性为true(默认为false)。详情视图 默认启用。 -
getViewData()- 返回ViewData对象,该对象中注册了视图 XML 中定义的所有 数据组件。可以使用其loadAll()方法触发视图的所有数据加载器:@Subscribe public void onReady(final ReadyEvent event) { getViewData().loadAll(); } -
getViewAttributes()- 返回存储命名值(named value)的ViewAttributes对象。VaadinSession可以作为一种存储。例如,详情视图中使用ViewAttributes来存储视图的 只读状态 和 锁定状态,并在刷新视图时还原这些设置。 -
getPageTitle()- 返回视图的标题。默认情况下,返回在视图描述符中定义的本地化值。可以重写该方法提供动态标题,例如:@Override public String getPageTitle() { User user = getEditedEntity(); return entityStates.isNew(user) ? messageBundle.getMessage("newUserTitle") : messageBundle.formatMessage("editUserTitle", metadataTools.getInstanceName(user)); } -
beforeLeave()- 一个回调函数,在导航至其他视图之前调用。是 Vaadin 导航生命周期 的一部分。-
通过该事件可以 延迟、取消 导航,或 切换 导航目的地。
-
当视图以对话框模式打开时不会执行。
-
如果不调用
super()方法则不能重写,因为该方法执行了框架相关的代码。
-
-
beforeEnter()- 一个回调函数,在导航进入视图之前调用。是 Vaadin 导航生命周期的一部分。-
可以用来获取
Location对象,还可以更改导航目标以转到与原始目标不同的目标。 -
当视图以对话框模式打开时不会执行。
-
如果不调用
super()方法则不能重写,因为该方法执行了框架相关的代码。
-
-
afterNavigation()- 一个回调函数,在导航完成时调用。是 Vaadin 导航生命周期的一部分。-
可以用来获取
Location对象。 -
当视图以对话框模式打开时不会执行。
-
如果不调用
super()方法则不能重写,因为该方法执行了框架相关的代码。
-
-
当视图以对话框模式显示时,还有两个可以定制 header 和 footer 的回调函数。需要在视图类中重写这两个方法才能使用。
-
configureDialogWindowHeader()- 这个回调方法可以在视图以OpenMode.DIALOG模式打开时配置 DialogWindow 的 header。该方法提供了对 header 组件的访问,可以添加自定义的组件、文字或样式元素。@Override protected void configureDialogWindowHeader(DialogWindowHeader header) { H3 title = uiComponents.create(H3.class); title.setText("- Opened in Dialog Mode!"); header.add(title); } -
configureDialogWindowFooter()- 这个回调方法可以在视图以OpenMode.DIALOG模式打开时配置 DialogWindow 的 footer。该方法提供了对 footer 组件的访问,可以添加自定义的组件、文字或样式元素。@Override protected void configureDialogWindowFooter(DialogWindowFooter footer) { JmixButton saveButton = uiComponents.create(JmixButton.class); saveButton.setText("Save"); footer.add(saveButton); }下面的截图是上面自定义 header 和 footer 代码的运行结果:
-
StandardListView 的方法
-
closeWithDiscard()- 请求使用StandardOutcome.DISCARD关闭视图。 -
getLookupComponent() / findLookupComponent()- 返回该 查找视图 中用于获取值的组件。默认情况下,返回 @LookupComponent 注解中id属性指定的组件。 -
setSelectionValidator()- 设置一个谓词,用于测试所选条目是否可以由SelectionHandler处理。 -
setSelectionHandler()- 设置处理所选条目的回调方法。默认情况下,如果是为 dataGrid 数据网格 组件打开的查找视图,则将选择的结果添加到 集合容器 中,如果是为字段控件打开的查找视图,则将选择的结果设置回字段,例如 entityPicker 实体选择器。DialogWindow<View<?>> dialog = dialogWindows.lookup(ProjectDetailView.this, User.class) (1) .withSelectHandler(users -> { (2) for (User user : users) { ProjectParticipant projectParticipant = dataManager.create(ProjectParticipant.class); projectParticipant.setUser(user); projectParticipant.setProject(getEditedEntity()); projectParticipant.setRole(projectRole); participantsDc.getMutableItems().add(projectParticipant); } }) .build(); View<?> view = dialog.getView(); if (view instanceof MultiSelectLookupView multiSelectLookupView) { (3) multiSelectLookupView.setLookupComponentMultiSelect(true); } dialog.open();1 创建不绑定任何 UI 组件的查找视图 builder。 2 为查找视图定义选择处理器。 3 检查打开的查找视图是否支持多选。
StandardDetailView 的方法
-
getEditedEntity()- 视图显示时,返回正在编辑的实体实例。该实例是设置在带 @EditedEntityContainer 注解的数据容器中的实例。在 InitEvent 监听器中,此方法返回
null。在 BeforeShowEvent 监听器中,此方法返回传递给视图进行编辑的实例(之后,视图打开过程中,将重新加载实体,并为数据容器设置不同的实例)。 -
详情视图可使用下列方法关闭:
-
closeWithSave()- 验证并保存更改,然后使用StandardOutcome.SAVE关闭视图。可以在自定义事件监听器调用此方法,或在视图中添加内置的detail_saveClose操作。 -
closeWithDiscard()- 忽略任何未保存的更改,并使用StandardOutcome.DISCARD关闭视图。可以在自定义事件监听器调用此方法,或在视图中添加内置的detail_discard操作。
如果使用
close(StandardOutcome.CLOSE)或closeWithDefaultAction()关闭视图,并且 DataContext 中有未保存的更改,则在关闭视图之前将显示一个对话框,其中显示对应的消息。可以使用 jmix.ui.view.use-save-confirmation 应用程序属性调整通知的类型。如果使用closeWithDiscard()或close(StandardOutcome.DISCARD)方法,则将忽略未保存的更改,而不会显示任何消息。 -
-
hasUnsavedChanges()- 如果视图有未保存的更改,则返回true。默认实现会检查DataContext中是否有已删除或已修改的实体。如果在DataContext中只有新实体标记为已修改,则检查这些实体自打开视图以来是否已被修改。可以重写此方法以提供额外的检查,或者完全跳过检查并返回false。 -
save()- 在不关闭视图的情况下验证并保存更改。可以在自定义事件监听器调用此方法,或在视图中添加内置的detail_save操作。此外,还可以重写save()方法以在保存数据后执行某些操作,示例:@Override public OperationResult save() { return super.save() (1) .then(() -> { // ... (2) }); }1 调用父类方法执行默认逻辑。 2 在保存数据后执行操作。 -
setReloadSaved(boolean)- 设置在调用 closeWithSave() 方法后是否应重新加载已编辑的实体。默认值为false。当以对话框模式打开视图时,框架会使用
true值调用此方法,可以在打开视图的情况下返回已保存的实体实例。如果不需要在对话框模式中重新加载已保存的实体,可以在 ReadyEvent 监听器中调用setReloadSaved(false)。 -
setShowSaveNotification(boolean)- 设置在成功保存的情况下是否显示通知。默认值为true。 -
getSaveNotificationText()- 返回保存的通知文本。默认实现会基于实体和实例名称生成文本。可以重写该方法返回自定义的通知文本。 -
setShowValidationErrors(boolean)- 组件验证后,是否使用 showValidationErrors() 方法显示错误。默认值为true。 -
setCrossFieldValidationEnabled(boolean)- 设置是否应在保存更改之前执行跨字段验证。使用UiCrossFieldChecks约束组 验证实体实例。默认值为true。 -
getLockStatus()- 返回当前编辑实体实例的 悲观锁 状态。可能值:-
LockStatus.NOT_SUPPORTED- 实体不支持悲观锁。 -
LockStatus.LOCKED- 实体实例已成功锁定。 -
LockStatus.FAILED- 锁定失败,因为实体已被其他人锁定。
-