Table of Contents
-
支持HTML
-
支持PDF
-
支持CSV
为顶层DSL,负责统筹页面图形元素与局部内容更新。当我们打算渲染一个完整页面时,还需要通过菜单DSL为页面添加导航栏。
该DSL还负责管理弹窗。使用 modal
打开弹窗,或使用 closeModalAndUpdateBlock
(和一些其他要素) 关闭弹窗。
代码示例:如何构建块
Figure 1. 带有多个子标签页的块 (见代码示例).
代码示例
def editSlideshow(CmsPage slideshow) {
UiBlockSpecifier b = new UiBlockSpecifier()
Boolean createNew = slideshow == null
if (!slideshow)
slideshow = new CmsPage(pageType: CmsPageType.SLIDESHOW)
b.ui {
if (createNew)
modal {
form
buildCmsSlideshowForm(slideshow),
BlockSpec.Width.MAX
}
else {
anonymousBlock BlockSpec.Width.HALF, { (1)
form
buildCmsSlideshowForm(slideshow),
BlockSpec.Width.MAX
}
blockTabs BlockSpec.Width.HALF, {
blockTab "Images", buildImagesTab(slideshow)(2)
blockTab "Videos", buildVideosTab(slideshow)
}
}
}
taackUiService.show(b, buildMenu()) (3)
1 | 创建一个不可见的块作为承载主体,占据二分之一页面宽度 |
2 | 创建2个子标签页,页面加载完成时默认先显示第一个 |
3 | 将整个块连同菜单一起发送至浏览器显示 |
代码示例:弹窗堆叠
表单处理完成后,您可以选择关闭弹窗并刷新页面一部分内容,可以在当前弹窗的基础上打开新一轮弹窗,可以重新加载当前页面,也可以直接导向至另外一个新页面。
通常来说完成表单后我们就会关闭弹窗。要么表单验证失败,错误报告会被发送至浏览器并直接显示在表单上,要么保存数据对象成功,关闭弹窗并刷新页面局部内容。
如下。
关闭弹窗并重新加载页面
@Transactional
@Secured(["ROLE_CMS_MANAGER", "ROLE_CMS_DIRECTOR"])
def saveCmsInsert() {
taackSaveService.saveThenReloadOrRenderErrors(CmsInsert)
}
若保存CmsInsert时无错误,则页面将会被刷新、重新加载数据。
关闭弹窗并导向至新页面
@Transactional
@Secured(["ROLE_ADMIN", "ROLE_CMS_MANAGER", "ROLE_CMS_DIRECTOR"])
def saveCmsPage() {
taackSaveService.saveThenRedirectOrRenderErrors( (1)
CmsPage, this.&pages as MethodClosure
)
}
1 | 若保存CmsInsert时无错误,则将导向至 pages 页面 (遵守URL Mappings规则) |
关闭弹窗并刷新页面局部内容
较为复杂的使用场景:关闭弹窗,并更新页面中某些ajaxBlock的内容
taackSaveService.saveThenDisplayBlockOrRenderErrors(
EngineeringChangeRequest, (1)
new UiBlockSpecifier().ui { (2)
closeModalAndUpdateBlock { (3)
show "Projects", buildShowProjects(ecr),
BlockSpec.Width.MAX, {
action
ActionIcon.ADD,
Ecr2Controller.&projectsForm as MC,
[id: ecr.id, ajaxBlockId: ajaxBlockId]
}
}
}
)
1 | 数据对象被保存后,您可以在同一个Action内关闭弹窗并刷新页面元素 |
2 | saveThenDisplayBlockOrRenderErrors 使用 UiBlockSpecifier 作为参数 |
3 | closeModalAndUpdateBlock 将先关闭弹窗,再应用改动 |
块状DSL架构
Figure 2. 块状DSL架构图
可以使用 ajaxBlock
容纳其他元素,以此实现页面的局部更新。