SpreadJS V19.2 新特性揭秘:数据绑定支持DataManager

0 阅读6分钟

表格里的"绑定",是把界面与数据连起来的那根线。过去它的数据源是一个现成的对象:一行员工数据,一个订单数组,一段接好的 JSON。绑定做的是把这条对象里的字段,映射到表格的行列上去。这套机制成熟而稳定,只是有一个朴素的问题:数据源是一次性交给绑定的,绑定成了对象和表之间一对一的关系——数据本身长什么样、从哪里来、和别的数据是什么关系,绑定的那一侧并不关心。

SpreadJS 里有另一套组织数据的机制,叫数据管理器(DataManager)。它在一个工作簿内部管理结构化数据表,定义表的结构、字段规则与表之间的关联,再生成供展示使用的数据视图。集算表、甘特表、报表这些新版组件,都依托它运行。过去有个略显尴尬的断层:绑定的世界接的是静态对象,数据管理器的世界接的是结构化数据,普通工作表里最常用的几种绑定,够不着数据管理器。

V19.2 把这个断层接通了。工作表绑定、单元格绑定、表格绑定这三条最常见的数据通路,现在都能直接以数据管理器数据表为数据源。数据被组织、被管理的地方,与数据被展示、被编辑的地方,从此共用同一套数据。

三种绑定,一条通路

工作表绑定,让一张普通工作表整体以某张数据管理器表为数据源。数据表在数据管理器中注册,列结构随之铺开,工作表的行列与数据表的记录一一对应;录入的新记录也会回写到数据表与视图里,数据的两端始终同步。就这一场景而言,当前面向本地数据源,涉及排序与筛选的数据同样在支持范围内。

单元格绑定的形态有所不同。它适合把一张表摊成"一条记录一张表"的录入界面——工作表的各个单元格分别绑定到某条记录的各个字段。数据源换成数据管理器表之后,还能额外指定一个"当前记录号",决定界面此刻显示的是表中的第几条记录。录入、保存、翻到下一条,单元格的内容跟着记录切换而更新。一张像表单一样的工作表,背后是一张可以逐条翻阅的数据表。

这类"一张表单摊一条记录"的形态,在信息录入与逐条核对的场合最合用:主数据补录、档案核对、按记录审批,界面固定、字段固定,只有当前记录在换。过去要实现同样的效果,记录间的切换要在数据一侧自己维护,如今它作为绑定能力的一部分一并提供,做表的人不必再为"翻页"单独写逻辑。

动画 (1).gif

表格绑定路径与嵌套数据

第三种场景是工作表里常见的表格(Table)。过去表格绑定的数据源同样限于普通数组。当数据管理器表中的记录本身带着嵌套的子表——比如一名员工名下有多个项目——表格便可以用"绑定路径"指到这条记录的子列表上,把一段嵌套的子数据在表格里展开成行列。记录是当前的这一条,表里列出的就是这条记录的项目明细。当前记录一旦切换,单元格里的字段与这张子表会一起翻页——绑定路径锚定在记录上,嵌套表显示的始终是当前这条记录的下一层,不必为切换后的子表重新指定数据源。

三种绑定合起来,覆盖了从"整表铺开"到"单条表单"再到"嵌套明细"的大多数形态。它们的数据都指向数据管理器,数据的结构与口径在那里被统一打理,绑定的这一侧只需专注于呈现与编辑。

绑定可以只写名字

实现上有意保留了一种灵活性:绑定数据管理器表时,既可以传入数据表实体,也可以只传表的名字。对集成了复杂数据流的系统而言,数据表可能由别处的逻辑异步创建;绑定先按名字记录下来,待数据表就绪后再解析。这层设计让"先摆绑定、后上数据"成为可能,也使得绑定关系在存档、读档的过程中更贴近数据管理器自己的身份体系。

在设计器里点一点

代码之外,设计器也给了可视化入口。设计器的绑定面板中,工作表绑定新增了"绑定数据管理器表"的选项,选定后弹窗选择数据表与记录号,也可一键清空数据源。单元格绑定一侧支持在数据管理器表与普通数据源之间切换,选定数据管理器表后,可用的绑定字段直接从表的字段里列出,供逐个设置绑定路径。数据源的更换不再只靠写代码,终端使用者也能在设计界面里完成。对设计器的使用者而言,绑定数据管理器表的入口与原先绑定静态数据的入口并列存在,随时可以在两类数据源之间切换,也能一键把数据源清空、回到空表;已铺好的绑定不会因为切换而乱套,选入新的数据表后,按新表的字段重新映射即可。

image.png

这一步为之后留了什么

把绑定接上数据管理器,本身解决的是"数据源统一"的问题;而它真正的意义,往往在下一步才显现。绑定的结果要与多人协作、要与业务数据保持同源,前提就是绑定背后有一套被统一管理的数据。数据管理器正是那套管理的落点。绑定的升级,为后续的协同场景铺平了路——多人同时编辑同一张绑定表,编辑结果彼此一致,这件事在数据源统一之后,才谈得上实现。

更底层的变化在于,绑定从"一次性的快照"变成了一种"活的引用"。绑定一旦固定,数据源此后的任何更新都与这张工作表无关;而指向数据管理器的绑定,数据的结构与口径由数据管理器持续打理,工作表里铺开的只是它当前的一份呈现。数据侧的每一次变化,不必再由人手动重新接一次线。这种"活着"的绑定,正是它足以走向协同的前提。

同一份数据,从被组织、被管理,到被摆进界面、被人在线编辑,如今走的是同一条路。绑定的这一小步,把表格与数据之间那根原本只管"连上"的线,变成了贯穿数据全生命周期的一条通路。