Table of Contents
这些具体应用场景将展示开发人员在开发过程中的职责 (对应到图表中就是控制器参与者),以及框架在开发过程中的作用 (对应到图表中就是蓝色长方形部分)。
显示表单,保存数据对象
这个过程有2个Action参与,并涉及使用了2个Service:
Figure 1. 表单流程时序图
代码示例:表单+保存流程
def userForm(User user) { (1)
user ?= new User() (2)
UiFormSpecifier f = new UiFormSpecifier() (3)
f.ui user, {
hiddenField user.subsidiary_
hiddenField user.origin_
section "User", {
field user.username_
field user.firstName_
field user.lastName_
ajaxField user.manager_, this.&selectUserM2O as MC
field user.trigram_
field user.password_
}
section "Coords", {
field user.businessUnit_
field user.job_
field user.directPhone_
field user.additionalPhone_
field user.mail_
field user.mainSubsidiary_
field user.allowedSubsidiaries_
}
// [. . .]
formAction this.&saveUser as MC, user.id (4)
}
taackUiService.show new UiBlockSpecifier().ui { (5)
modal {
form "User Form", f, BlockSpec.Width.MAX
}
}
}
@Transactional
@Secured("ROLE_ADMIN") (6)
def saveUser() { (7)
taackSaveService.saveThenRedirectOrRenderErrors(User, this.&listUser) (8)
}
1 | 负责显示表单的Action |
2 | 若数据对象不存在,则新建 |
3 | 创建表单块 |
4 | 表单提交按钮,负责传输表单数据至 saveUser Action中 |
5 | 将表单呈现在页面上 |
6 | 给该Action添加权限管理 |
7 | 负责保存数据对象的Action |
8 | 调用taackSaveService,若验证通过,则将页面重定向至 listUsers 。 |
显示表格,附带可排序列、行内按钮、以及筛选器
只需要一个Action即可管理翻页、筛选、以及排序:
Figure 2. 表格管理流程时序图
代码示例:筛选器与表格
def index() { (1)
User cu = authenticatedUser as User
UiFilterSpecifier f = buildUserTableFilter cu (2)
UiTableSpecifier t = buildUserTable f (3)
UiBlockSpecifier b = new UiBlockSpecifier() (4)
b.ui {
tableFilter "Filter", f, "Users", t, BlockSpec.Width.MAX, {
action ActionIcon.CREATE, this.&userForm as MC (5)
}
}
taackUiService.show(b, buildMenu()) (6)
}
1 | 负责列出数据的Action |
2 | 构建筛选器。这里它以当前用户作为参数,因为该表格想要列出当前用户所在的团队的所有人员。 |
3 | 构建表格 |
4 | 构建总块以包含进筛选器块与表格块 |
5 | 添加按钮,负责创建新用户 |
6 | 将该块呈现在页面上 |
我们特意将构建好的筛选器传入buildTable中,是为了进行数据查询以及预防黑客 |
显示弹窗、关闭弹窗、更新页面一部分内容
Figure 3. 弹窗管理流程时序图
代码示例:关闭弹窗与刷新页面内容
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 将会关闭弹窗并应用新内容至当前页面 |
待做事项
-
Updating a portion of a page
-
Show some object with an editable field
-
Show a graph
-
Export a table in CSV
-
Rendering a block in a PDF
-
Rendering a block in a Mail
-
…