在 SpreadJS 表格控件中,当 Table 数据绑定后,对 Table 插入行,新行内填充部分单元格。在 getDataSource () 返回值中,关于新增行的数据对象,仅有被填充单元格对应的字段。如何获取完整字段,不论对应单元格是否填充了数据。
数据绑定使用的数据是一个 JavaScript 对象,在代码运行期间,这个对象被创建后即存在于内存中。这也是为什么把文件导出时虽然携带了绑定的数据源,但是导入至新应用的 Workbook 中再调用 Worksheet:getDataSource() 得到的结果为 null 的原因。即在新应用运行时的内存空间中没有原本的数据源对象。
解决方法
回到问题背景,虽然新增行在 Table 区域内,但是没有数据,意味着这行数据在数据源对象中是一个各字段属性均不存在的空对象,如图 1 所示。 (图 1. 新行对应空数据对象)
紧接着,如果对新增行内的个别单元格写入数据,数据绑定功能的双向绑定特性将单元格值和相关字段对应起来,组成一个对象。对于没被填充数据的单元格,不做类似处理。因此,Worksheet:getDataSource () 获取到新增行中的数据对象仅包含被填充单元格对应的字段属性,如图 2 所示。 (图 2. 新行数据对象包含被填充字段属性)
那如何获取完整字段呢?即,无论填充了哪些字段,都能获取到这一行对应的完整字段。Worksheet:getDataSource () 应该是做不到了,因为接口并未提供可回调操作的参数,所以需要在接口外想办法了。
回顾下对 Table 执行数据绑定的准备工作,对 Table 列设置绑定路径,而每个列的绑定路径实际上对应为数据源中的一个字段,也就是说数据源模型可知。那么,在代码上下文中存储数据源模型为元数据,同时为每个字段设置数据类型和默认值,后面会用到。如图 3 所示,这个元数据定义了数据源对象的各个字段,名称分别为 a、b、c、d、e 和 f,为简单起见,定义类型均为 string,且默认值为空字符串。
(图 3. 数据源模型元数据)
在 Worksheet:getDataSource () 后,结合数据源模型元数据遍历每行单元格对应的数据对象,检查当前数据对象中是否包含元数据中的每项字段。对于未包含的字段项,在当前数据对象中扩充,并且根据元数据中该字段项的数据类型和默认值设置其值,如图 4 所示代码片段。由于数据源对象存在于内存空间中,因此这一修改动作会直接影响数据源对象状态。
(图 4. 数据对象默认值设置代码)
最终效果如下图所示: