页面 JSON
一页的布局存在 sys.page_def.json。它是类 JSON5:可以有尾逗号,由前端 eval 解析,所以不是交给 JSON.parse 的严格 JSON。
我们自己的键大写开头。DevExtreme 原生键小写开头,含义以 DevExtreme 文档 为准,这里不重抄。
页面根
| 键 | 类型 | 说明 |
|---|---|---|
Title | string | 页面标题 |
NoScroll | boolean | 页面本身不滚动,把滚动交给里面的表格 |
SubPages | number[] | 允许作为弹窗打开的子页面 id。不声明时,子页的 SQL 过不了白名单 |
Body | object[] | 组件列表。每一项是 Type、Id、Option |
{
Title: "销售订单",
NoScroll: true,
SubPages: [180],
Body: [
{
Type: "data_grid",
Id: "orders",
Option: { /* 见各组件 */ }
}
]
}Type 决定加载哪一个引擎脚本,运行时调用 init_<Type>(dom, Id)。Id 在这一页里唯一,引擎用它取出 Option。可用的 Type 见 两类页面。
历史写法 title / body / sub_pages,以及组件上的 name / id / user_option,加载时会翻译成现在的名字。新页面直接写现在的名字。
Option 里常见的三块
表格、树表、表单都按这个形状拆:
| 块 | 放什么 |
|---|---|
Component | 引擎自己的配置:哪条 SQL 加载、保存、是否自动加载、是否只读 |
Toolbar | 工具栏。Items 按按钮名开关,MoreItems 放自定义按钮 |
Grid / Form / Pivot | DevExtreme 原生配置,键是小写 |
simple_form 的 Toolbar 本身就是 dxToolbar:小写的 visible、items 是原生键,页面写的 Items、MoreItems 会并进 items。
"js:" 表达式
任意字符串值可以写成 "js:" 加一段 JavaScript。运行时求值,this 指向组件实例。
ShowIf: "js:this.mainSelectValue === 1"求值抛错时,如果同级写了 Fallback,用 Fallback 里同名键的值。正常求出 false 不会走 Fallback。
Fallback: { disabled: true }用 SQL 填原生配置
有些 DevExtreme 的键要等 SQL 回来再填,例如下拉的 dataSource。在同级写 InitSql,键名和要填的原生键相同。同级必须先放一个占位值。
{
dataSource: [],
value: null,
InitSql: {
dataSource: { sql_id: 77 },
value: { sql_id: 78, _return_val: true }
}
}dataSource: { FromPool: "名称" } 不发请求,改用本组件 Component.DataPool 里同名的结果。
ShowIf
挂在 summary、totalItems 的某一项等对象上。表达式为假时,整块配置被拿掉。键名写成 xShowIf 表示这一项先停用。
列上的 KeepData
visible: false 的列默认会被放进 __hide_fields__,SQL 执行完后这些字段从结果里删掉。列要隐藏,但数据还要参与 js: 或权限计算时,写 KeepData: true。否则前端拿到空值。
各组件自己的键见后面的参考页。SQL 参数对象 { sql_id, ... } 里的键是参数名,保持原样,不改成大写。