应用设计:布局、部件、变量、事件
四个构件怎样配合;带数字的设计规则;对应到 Nexus 应用的写法。

本课目标
读完这一课,你将能够
- 说出应用的四个构件:布局、部件、变量、事件,以及它们怎样配合
- 用一组带数字的规则检查界面是否过载、过挤
- 把这些构件对应到 Workshop 定义和 Nexus 代码,并说明拖拽编辑器仍待做
四个构件
对象浏览器和对象视图开箱即用。业务再具体一点,就要为一个工作流搭一个专门的应用。Workshop 已支持用 JSON 定义页面、分区、组件和变量。拖拽编辑器仍待做。设计应用时先分清四个构件:
布局
页眉、页面、区块、浮层。页眉全局不变,放标题和标签页;一个页面对应一个工作流;区块可以分列、分行、分标签页,也可以对一个对象集逐个循环;浮层有从侧边滑出的抽屉和居中的对话框两种。
部件
界面上的一块内容:表格、筛选列表、图表、按钮组。每个部件有输入变量(数据从哪来)和输出变量(它产生什么,例如「选中的对象」)。
变量
数据在应用里流动的方式。有类型(文字、数字、日期、对象集、对象集筛选……),有定义方式(静态值、函数、聚合、对象属性、SQL)。只有被看得见的部件用到时才计算。
事件
用户做了某件事之后发生的行为:切换页面、开关浮层、设置或重算变量、刷新数据。事件按配置的顺序依次执行。
有一个陷阱:「设置变量」的事件会立刻把值复制过去,但依赖它的下游变量这时还没更新,事件也不会等它们。需要先算完再往下走的步骤,要拆成两次用户触发。
怎样设计得好用
好用与否可以查数字。过载指一屏里能点的东西太多,过挤指没有留白:
- 顶层导航里的主要操作不超过 5 个;一个视图里可见的部件(按钮、面板、部件合计)不超过 10 个。
- 留白占屏幕的 30% 到 40%;间距用紧凑档,约 16 像素。
- 顺着阅读的路线排:从左上角开始,向右、向下;筛选放最左,内容往右流。
- 页眉写清页面的目的,区块标题给内容分组,副标题一句话说明。
- 浮层只做临时、次要的事,比如填一张表;分析类内容别放进浮层,因为对话框会挡住背景。
- 能滚动的区域里,可点击的目标至少 30 像素;导航和标签页放在页眉里,只有内容区滚动。
产线看板一屏放了 14 个按钮、5 张图、3 个表,什么都能点。
顶部只留 2 个主要操作;左边是产线与状态筛选,中间一张工单表;「登记缺陷」放在点开一行之后的对话框里。
在 Nexus 应用里怎么对应
Workshop 用 pages、sections、widgets、variables 声明页面。用 aidc semantic applications save --ontology cell-demo --file board.json --dry-run 校验定义,去掉 --dry-run 保存。页面地址是 /semantic/cell-demo/applications/<apiName>。需要定制交互时,Nexus 应用用代码实现同样的构件。界面用界面 SDK 的类和 ui 模块,数据用语义 SDK:
| 搭建器里的构件 | Nexus 应用里 | |
|---|---|---|
| 页面、标签页 | 页面、标签页部件 | 单页应用,多页用 hash 路由;标签页用 ui.tabs |
| 浮层 | 抽屉、对话框 | 原生 dialog 元素;确认与输入用 ui.confirm、ui.prompt |
| 部件 | 表格、按钮组、图表 | 界面 SDK 的类:aidc-table、aidc-card、aidc-btn |
| 变量 | 对象集变量、字符串变量 | 脚本里的状态;对象集变量就是一个 client.objects(…).where(…) 值 |
| 事件 | 按钮上配的事件 | DOM 事件处理函数,顺序用 await 保证 |
对照一下那个陷阱:脚本里可以先 await 重算,再进下一步,不会读到旧值。下面是示例工厂看板的状态骨架:
const state = { line: null, selected: null }; // 变量:页面上的两个值
const orders = () => client.objects("workOrder").where(
state.line ? { lineCode: state.line } : {}); // 对象集变量:由别的变量算出来
async function setLine(line) { // 事件:换产线
state.line = line;
state.selected = null; // 先清掉选中的工单
await render(await orders().fetchPage({ $pageSize: 50 })); // 再重算,顺序由 await 保证
}
要点
- 应用由布局、部件、变量、事件四种构件搭成。
- 变量只在被看得见的部件用到时才计算;事件按顺序执行,但不等下游变量算完。
- 好用的界面有数字可查:主要操作不超过 5 个、可见部件不超过 10 个、留白 30% 到 40%。
- 浮层给临时、次要的事,分析内容别放进浮层。
- AIDC 已有 Workshop 的页面、分区、组件和变量。拖拽编辑器仍待做;Nexus 应用用界面 SDK 和脚本实现定制交互。
练一练
设计一页,再拆成变量
用示例工厂的采购员看板练:物料低于安全库存,要起草采购订单。
画出页眉、筛选、主区域和浮层,数一数可见部件是否不超过 10 个。
写出这一页需要的 3 到 5 个变量(例如选中的供应商、状态筛选、对象集),说明哪个由哪个算出来。
参照上面的 setLine,写一个「换供应商时清掉选中的物料」的函数,并说明为什么要 await。
小测
选一个答案,马上看解析。
Q1一个事件先「设置变量 A」,紧接着要用依赖 A 的变量 B。为什么 B 可能还是旧值?
事件依次执行,但不等下游重算;需要先算完的步骤要拆开。
Q2下面哪个界面最需要瘦身?
主要操作应不超过 5 个,可见部件不超过 10 个。
Q3「切到某个标签页时才去读那一页的数据」,最接近搭建器里的哪个机制?
看不见的页面不算,这也是 AIDC「点击才查看」的原则。