应用设计:布局、部件、变量、事件

第 3 课 · 共 6 课 约 8 分钟

四个构件怎样配合;带数字的设计规则;对应到 Nexus 应用的写法。

本课目标

读完这一课,你将能够

  • 说出应用的四个构件:布局、部件、变量、事件,以及它们怎样配合
  • 用一组带数字的规则检查界面是否过载、过挤
  • 把这些构件对应到 Workshop 定义和 Nexus 代码,并说明拖拽编辑器仍待做

四个构件

对象浏览器和对象视图开箱即用。业务再具体一点,就要为一个工作流搭一个专门的应用。Workshop 已支持用 JSON 定义页面、分区、组件和变量。拖拽编辑器仍待做。设计应用时先分清四个构件:

LAYOUT

布局

页眉、页面、区块、浮层。页眉全局不变,放标题和标签页;一个页面对应一个工作流;区块可以分列、分行、分标签页,也可以对一个对象集逐个循环;浮层有从侧边滑出的抽屉和居中的对话框两种。

WIDGET

部件

界面上的一块内容:表格、筛选列表、图表、按钮组。每个部件有输入变量(数据从哪来)和输出变量(它产生什么,例如「选中的对象」)。

VARIABLE

变量

数据在应用里流动的方式。有类型(文字、数字、日期、对象集、对象集筛选……),有定义方式(静态值、函数、聚合、对象属性、SQL)。只有被看得见的部件用到时才计算。

EVENT

事件

用户做了某件事之后发生的行为:切换页面、开关浮层、设置或重算变量、刷新数据。事件按配置的顺序依次执行。

有一个陷阱:「设置变量」的事件会立刻把值复制过去,但依赖它的下游变量这时还没更新,事件也不会等它们。需要先算完再往下走的步骤,要拆成两次用户触发。

怎样设计得好用

好用与否可以查数字。过载指一屏里能点的东西太多,过挤指没有留白:

  • 顶层导航里的主要操作不超过 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 个。

小测

选一个答案,马上看解析。

Q1一个事件先「设置变量 A」,紧接着要用依赖 A 的变量 B。为什么 B 可能还是旧值?

Q2下面哪个界面最需要瘦身?

Q3「切到某个标签页时才去读那一页的数据」,最接近搭建器里的哪个机制?

延伸阅读