数据组件方法
编辑方法
新增数据
数据组件提供 newData 方法新增数据,支持新增多行数据。新增方法为异步方法,异步方法的调用参考《页面模型-代码模型》中 ES6 异步方法
- 对于文本类型的主键,系统会赋值一个 UUID
- 对于从表数据,系统还会将主表的主键赋值给从表的外键列
方法:
newData (JSON options)
描述:
新增数据,支持新增多行数据
参数:
{
"parentRow" : {Row | String} - 树形数据的父节点,支持行对象或行 id,非树形不需要设置,
"index" : {integer} - 新增数据的位置,缺省新增到最后,
"defaultValues" : {array} - 新增行的默认值数组 ,数组的长度决定新增行数,数组中的对象是列的默认值
defaultValues 格式:
[
{列名:默认值,...},
{列名:默认值,...},
...
]
}
新增一条数据
await this.comp('mainData').newData();
新增多条数据
await this.comp('mainData').newData({
defaultValues : [
{sName:'a1',sCode:'b1'},
{sName:'a2',sCode:'b2'}
]
});
新增树形数据
let inputData = this.comp("inputData");
let detailData = this.comp("detailData");
await detailData.newData({
defaultValues: inputData.toJson({ui:false}),
parentRow: inputData.getValue("parentId")
})
取值
数据组件提供 getValue 和 getValueByID 方法获取某行某列的值,说明如下
方法:
getValue (String col, Row row)
描述:
通过列名和行对象获取列的值
参数:
col:{String} - 列名称
row:{Row}(可选) - 行,默认为当前行
返回值:
Any
方法:
getValueByID (String col, String rowid)
描述:
通过列名和行 ID 获取列的值,函数会遍历所有数据,不要在循环中大量使用以免引发性能问题
参数:
col:{String} - 列名称
rowid:{String} - 行 ID
返回值:
Any
当前行取值
let parentId = this.comp("inputData").getValue("parentId");
指定行取值
let data = this.comp("inputData")
let parentId = data.getValue("parentId",data.getCurrentRow());
或者
let data = this.comp("inputData")
let parentId = data.getValueByID("parentId",data.getCurrentRowID());
赋值
数据组件提供 setValue 和 setValueByID 方法给某行某列赋值,说明如下
方法:
setValue (String col, Any value, Row row)
描述:
通过列名和行对象设置列的值
参数:
col:{String} - 列名称
value: {Any} - 值
row:{Row}(可选) - 行对象,默认为当前行
方法:
setValueByID (String col, Any value, String rowid)
描述:
通过列名和行 ID 设置列的值,函数会遍历所有数据,不要在循环中大量使用以免引发性能问题
参数:
col:{String} - 列名称
value: {Any} - 值
rowid:{String} - 行 ID
当前行赋值
this.comp("inputData").setValue("showBtn",true);
指定行赋值
let data = this.comp("inputData")
data.setValue("showBtn",true,data.getCurrentRow());
或者
let data = this.comp("inputData")
data.setValueByID("showBtn",true,data.getCurrentRowID());
复制行
数据组件提供 copyRows 方法将行对象复制到另一个数据组件中,说明如下
方法:
copyRows (Row row, String destDataId)
copyRows (Array rows, String destDataId)
描述:
复制行对象到另一个数据组件中,支持复制多行数据
参数:
row : {Row} - 要复制的行对象
rows : {array} - 要复制的一组行对象
destDataId : {String} - 目标数据组件 id
示例代码
let data = this.comp("productData");
data.copyRows(data.getCurrentRow(),"targetData");
移动行
数据组件提供 moveTo 方法移动行。这个方法只调整显示位置,不调整数据,如需配和数据调整,需要自行处理。方法说明如下
方法:
moveTo (Row | String srcRow, Row | String targetRow, String mode)
描述:
移动行到目标行的上面、下面;如果目标行有子节点,可以移动到第一个子节点或最后一个子节点
参数:
srcRow : {Row | String} - 要移动的行对象或行 id
targetRow : {Row | String} - 目标行对象或行 id
mode : {String} - 移动方式: BEFORE、AFTER、FIRST_CHILD、LAST_CHILD
将第一行移到第三行的位置,原第二行和第三行上移,成为第一行和第二行。示例代码如下,移动前后效果图如下
onMoveToBtnClick = (event) => {
let data = this.comp("productData");
//获得移动行
data.first();
let srcRow = this.comp("productData").getCurrentRow();
//获得目标行
data.next();
data.next();
let tarRow = this.comp("productData").getCurrentRow();
//移动
this.comp("productData").moveTo(srcRow,tarRow,"AFTER");
}
交换行
数据组件提供 exchangeRow 方法交换两个行的位置。这个方法只调整显示位置,不调整数据,如需配和数据调整,需要自行处理。方法说明如下
方法:
exchangeRow (Row | String row1, Row | String row2, Row | String parentRow)
描述:
交换两个行的位置
参数:
row1 : {Row | String} - 要交换位置的第一行
row2 : {Row | String} - 要交换位置的第二行
parentRow : {Row | String} - 父节点,树形数据时必须指定父节点
第一行和第三行交换位置,示例代码如下,交换前后效果图如下
onExchangeRowBtnClick = (event) => {
let data = this.comp("productData");
//获得第一行
data.first();
let srcRow = this.comp("productData").getCurrentRow();
//获得第二行
data.next();
data.next();
let tarRow = this.comp("productData").getCurrentRow();
//交换
this.comp("productData").exchangeRow(srcRow,tarRow);
}
保存数据
数据组件提供 saveData 方法保存一条数据、提供 saveAllData 方法保存全部数据,分别说明如下。保存方法为异步方法,异步方法的调用参考《页面模型-代码模型》中 ES6 异步方法
方法:
saveData (JSON options)
描述:
保存当前行数据,除非很明确只保存这一行数据,否则建议使用 saveAllData 来处理,避免没保存上数据
参数:
options:{JSON} - 保存参数,格式如下
{
"ignoreInvalid" : {boolean} - 保存时不校验规则
}
方法:
saveAllData (JSON options)
描述:
保存数据组件中编辑过的数据,没有编辑则不执行保存
参数:
options:{JSON} - 保存参数,格式如下
{
"ignoreInvalid" : {boolean} - 保存时不校验规则
}
保存全部
let data = this.comp("mainData");
data.saveAllData();
保存当前行
let data = this.comp("mainData");
data.saveData();
保存时不校验规则
数据组件上设置的必填、约束等规则,在执行保存时会进行规则校验,设置参数 ignoreInvalid 为 true,实现不校验规则保存数据,示例代码如下:
let data = this.comp("mainData");
data.saveData({"ignoreInvalid":true});
检查数据
数据组件提供 check 方法检查数据是否符合设置的规则,说明如下
方法:
check (Boolean force)
描述:
根据数据组件上设置的规则检查数据
参数:
force:{Boolwan} - 是否强制检查,检查时机设置为保存前时,默认不执行检查数据
返回值:
{
"valid" : {boolean} - 数据是否符合规则
"msg" : {Array} - 不符合规则时,所有不符合项的提示信息
“invalidRequired" : {Array} - 所有不符合必填的列
"invalidConstrait" : {Array} - 所有不符合约束的列
}
保存数据时系统会自动调用检查数据方法,对于在数据组件中设置了必填、约束等规则,但是不使用数据组件的保存数据方法,可以单独调用检查数据方法,示例代码如下
let data = this.comp("productData");
let info = data.check(true);
if(!info.valid){
message.error(info.msg);
}
数据是否修改
数据组件提供 isChanged 方法判断数据是否有变化,新增、修改、删除后,isChanged 为 true
方法:
isChanged ()
描述:
判断数据是否有变化,新增、修改、删除后返回 true
返回值:
Boolean
示例代码
if(this.comp("mainData).isChanged()){
message.info("数据已经修改");
}
删除数据
数据组件提供 deleteData 方法删除数据,说明如下
方法:
deleteData (Any rows, JSON options)
描述:
删除数据,当 directDeleteMode=true 时直接提交后台删除,当 confirmDelete=true 时会弹出删除确认框
参数:
rows:{Any}(可选) - 支持5种情况:空、行对象、行对象数组、行 id、行 id 数组,缺省为当前行
options:{JSON} - 删除参数,格式:
{
"confirm" : {boolean} - 删除确认提示,缺省使用属性 confirmDelete
}
删除当前行
this.comp("mainData").deleteData();
删除指定行
使用行 id 数组删除
let table = this.comp("table2");
let ids = table.getSelectedRowIds();
this.comp("restData0").deleteData(ids);
使用行对象删除
let data = this.comp("mainData");
data.deleteData(data.getCurrentRow());
清除数据
清除数据和删除数据不同,删除数据会发送请求从数据库中删除数据,清除数据只是清除前端数据组件中的数据,不影响数据库
清除指定行
数据组件提供 remove 方法清除指定行的数据,说明如下
方法:
remove (Any row)
描述:
移除指定行的数据,只在前端移除不影响数据库
参数:
row:{Any}(可选) - 支持5种情况:空、行对象、行 id,缺省为当前行
示例代码
let data = this.comp("productData");
data.remove(data.getCurrentRow());
清除全部
数据组件提供 clear 方法清除全部数据,说明如下
方法:
clear ()
描述:
清除数据,前端数据清除不影响数据库中数据
示例代码
this.comp("pageData").clear();
刷新方法
刷新数据
数据组件提供 refreshData 方法刷新数据,总是返回第一页数据,说明如下。刷新方法为异步方法,异步方法的调用参考《页面模型-代码模型》中 ES6 异步方法
方法:
refreshData (JSON options)
描述:
数据刷新,当 confirmRefresh=true 并且数据是编辑或者新增状态时,刷新数据时显示刷新确认提示框
参数:
options:{JSON} - 刷新参数,格式如下
{
"append" : {boolean} - 追加模式,true 不清除原有数据,false 清除原有数据。默认:false,
"confirm" : {boolean} - 刷新提示,缺省使用属性 confirmRefresh
}
示例代码
let data = this.comp("数据组件 id");
await data.refreshData();
刷新指定页数据
数据组件提供 loadPageData 方法刷新指定页的数据,可用于数据分页显示时,刷新当前页数据,说明如下
方法:
loadPageData (Integer pageIndex, JSON options)
描述:
分页模式下加载第 N 页数据
参数:
pageIndex:{Integer} - 页索引
options:{JSON} 刷新参数,格式如下
{
"parentRow" : {Row | String} - 树形数据的父节点,支持行对象或行 id,
"confirm" : {boolean} - 刷新提示,缺省使用属性 confirmRefresh
}
示例代码
- 刷新当前页
从数据组件 pageData 中取出当前页号,调用数据组件的 loadPageData 方法
onRefreshPageDataBtnClick = (event) => {
//获取当前页号
let currentPage = this.comp("productData").getPageNumber();
this.comp("productData").loadPageData(currentPage);
}
- 刷新树形数据中指定父节点下的数据
let data = this.comp("treeData");
data.loadPageData(1,{"parentRow":data.getCurrentRow()});
过滤方法
过滤数据
数据组件提供 setFilter 方法设置过滤条件,再调用刷新数据方法刷新数据,说明如下。
方法:
setFilter (String name, FilterObj filter)
描述:
设置指定名称的过滤表达式,一个数据组件可以有多个过滤表达式,所有的过滤表达式将按 and 连接
参数
name:{String} - 过滤名称
filter:{FilterObj} - 过滤表达式,支持两种写法:JSON 数组、DbrestFilter 对象
过滤表达式
过滤表达式支持两种写法,一种是 JSON 数组,格式如下;另一种是 DbrestFilter 对象,参考《JS SDK》中使用 DbrestFilter 构造过滤条件
[{
name: 列名,
value: 值,
op: 运算符,
kind: 连接符,并且 and、或者 or,默认 and
}]
运算符目前支持:
- 等于 eq、不等 neq、大于 gt、小于 lt、大于等于 gte、小于等于 lte、等于(支持空字符串) eqb、不等于(支持空字符串) neqb
- 字符匹配 like、字符匹配(不区分大小写)ilike、字符不匹配 nlike、字符不匹配(不区分大小写)nilike
- 包含 inn、不包含 ninn
- 为空 isNull、非空 isNotNull
- 左小括号 LBRAC、右小括号 RBRAC
多种过滤方式
- 过滤字段等于一个值,使用 eq
过滤条件为:name = '张三',JS 代码如下
let data = this.comp("数据组件 id");
data.setFilter("eqfilter",[{name:"name",value:"张三",op:"eq"}]);
data.refreshData();
- 过滤字段包含某些值(等同于 sql 中的 in),使用 inn
过滤条件为:name in ('张三','李四'),JS 代码如下
let data = this.comp("数据组件 id");
data.setFilter("infilter",[{name:"name",value:"张三,李四",op:"inn"}]);
data.refreshData();
- 过滤字段字符匹配用 like,不匹配用 nlike,通配符使用 *
过滤条件为:name like 'abc%',JS 代码如下
let data = this.comp("数据组件 id");
data.setFilter("likefilter",[{name:"name",value:"abc*",op:"like"}]);
data.refreshData();
- 过滤值为空,使用 isNull
过滤条件为:name is null,JS 代码如下
let data = this.comp("数据组件 id");
data.setFilter("infilter",[{name:"name",value:null,op:"isNull"}]);
data.refreshData();
- 过滤值非空,使用 isNotNull
过滤条件为:name is not null,JS 代码如下
let data = this.comp("数据组件 id");
data.setFilter("infilter",[{name:"name",value:null,op:"isNotNull"}]);
data.refreshData();
多个过滤条件
- 日期范围过滤,使用 gte 或者 lte
过滤条件为:createDate >= date1 and createDate <= date2,JS 代码如下
let data = this.comp("数据组件 id");
let startDate=new Date();
startDate.setDate(5);
startDate = wx.Date.toString(startDate, wx.Date.STANDART_FORMAT_SHOT);
let endDate = wx.Date.toString(new Date(), wx.Date.STANDART_FORMAT_SHOT);
let filter = [];
filter.push({name:"createDate",value:startDate,op:"gte"});
filter.push({name:"createDate",value:endDate,op:"lte"});
data.setFilter("customfilter",filter);
data.refreshData();
- 日期时间范围过滤,使用 gte 或者 lte
过滤条件为:createTime >= '2020-04-02 00:00:00' and createTime <= date,JS 代码如下
let data = this.comp("数据组件 id");
let endDate = wx.Date.toString(new Date(), wx.Date.STANDART_FORMAT);
let filter = [];
filter.push({name:"createTime",value:"2020-04-02T00:00:00.000Z",op:"gte"});
filter.push({name:"createTime",value:endDate,op:"lte"});
data.setFilter("customfilter",filter);
data.refreshData();
- 多个条件使用 and 或者 or 拼接,此时可能会使用左右小括号 LBRAC 和 RBRAC
例如过滤条件为:(name = '张三' and (code = '001' or address = '上海')),JS 代码如下
let data = this.comp("数据组件 id");
let filter = [];
filter.push({op:"LBRAC"});
filter.push({name:"name",value:"张三",op:"eq"});
filter.push({op:"LBRAC"});
filter.push({name:"code",value:"001",op:"eq"});
filter.push({name:"address",value:"上海",op:"eq",kind:"or"});
filter.push({op:"RBRAC"});
filter.push({op:"RBRAC"});
data.setFilter("customfilter",filter);
data.refreshData();
清空某个过滤条件
setFilter 的第一个参数就是要清空的 filter 的名字,第二个参数为空,示例代码如下
let data = this.comp("数据组件 id");
data.setFilter("customfilter","");
data.refreshData();
获取所有的过滤条件
数据组件提供 buildFilter 方法获取所有的过滤条件,说明如下
方法:
buildFilter ()
描述:
生成返回过滤字符串
返回值:
String
示例代码
let data = this.comp("数据组件 id");
data.buildFilter();//返回的是数组
清除所有的过滤条件
数据组件的 filters 属性提供 clear 方法清除所有过滤条件,示例代码如下:
let data = this.comp("数据组件 id");
data.filters.clear();
data.refreshData();
树形根过滤
数据组件提供 getTreeOption 方法获取树的定义信息,其中 rootFilter 属性表示根过滤条件
- 为空时,系统使用 父节点 is null 获取根数据
- 设置后,使用该条件获取根数据
根过滤表达式
根过滤表达式和普通过滤表达式写法不同,根过滤表达式是一个字符串数组,格式如下
["连接符.列名=运算符.值"]
运算符和连接符同过滤表达式中的运算符和连接符
根过滤案例
- 过滤字段等于一个值,使用 eq
过滤条件为:parent = '1',JS 代码如下
let data = this.comp("mainData");
data.getTreeOption().rootFilter = ["parent=eq.1"];
data.refreshData();
- 多个条件使用 and 或者 or 拼接
过滤条件为:parent = '1' or parent = '2',JS 代码如下
let data = this.comp("mainData");
data.getTreeOption().rootFilter = ["parent=eq.1","or.parent=eq.2"];
data.refreshData();
获取方法
获取行 id
数据组件提供 getCurrentRowID 方法获取当前行主键列的值,提供 getRowID 方法获取指定行主键列的值
获取当前行 id
数据组件提供 getCurrentRowID 方法获取当前行主键列的值,说明如下
方法:
getCurrentRowID ()
描述
获取当前行主键列的值
返回值:
Any 行 ID
示例代码
let rowid = this.comp("selectData").getCurrentRowID();
获取指定行 id
数据组件提供 getRowID 方法获取指定行主键列的值,说明如下
方法:
getRowID (Row row)
描述:
获取指定行主键列的值
参数:
row:{Row} - 行对象
返回值:
Any 行 ID
示例代码
let selectData = this.comp("selectData");
let dialogData = this.comp("dialogData");
dialogData.each((option)=>{
let row = option.row;
let rowid = option.data.getRowID(row);
if(null!=selectData.getRowByID(rowid)){
await selectData.newData();
let newRow = selectData.getCurrentRow();
Object.assign(newRow,row);
}
});
获取行对象
数据组件提供 getCurrentRow 方法获取当前行,提供 getRowByID 方法获取指定行对象
获取当前行对象
数据组件提供 current 属性和 getCurrentRow 方法获取当前行,分别说明如下
属性:
current
描述
获取当前行
返回值:
Row 行对象
示例代码
let row = this.comp("selectData").current;
方法:
getCurrentRow ()
描述
获取当前行
返回值:
Row 行对象
示例代码
let row = this.comp("selectData").getCurrentRow();
获取指定行对象
数据组件提供 getRowByID 方法根据行 id 获取行对象,说明如下
方法:
getRowByID (String rowid)
描述:
根据行 id 获取行对象
参数:
rowid:{String} - 行 id
返回值:
Row 行对象
示例代码
let selectData = this.comp("selectData");
let dialogData = this.comp("dialogData");
dialogData.each((option)=>{
let row = option.row;
let rowid = option.data.getRowID(row);
if(null!=selectData.getRowByID(rowid)){
await selectData.newData();
let newRow = selectData.getCurrentRow();
Object.assign(newRow,row);
}
});
获取行状态
数据组件提供 getCurrentRowState 方法获取当前行状态,提供 getRowState 方法获取指定行状态
获取当前行状态
数据组件提供 getCurrentRowState 方法获取当前行状态,说明如下
方法:
getCurrentRowState ()
描述:
获取当前行的状态
返回值:
String,包括:new,edit,delete,none
示例代码
let data = this.comp("treeData");
let state = data.getCurrentRowState();
获取指定行状态
数据组件提供 getRowState 方法获取指定行状态,说明如下
方法:
getRowState (Row row)
描述:
获取指定行的状态
参数:
row:{Row}(必填) - 行对象
返回值:
String,包括:new,edit,delete,none
示例代码
let data = this.comp("treeData");
let state = data.getRowState(data.getCurrentRow());
获取所有列标识
数据组件提供 getColumnIDs 方法获取所有列标识
方法:
getColumnIDs ()
描述
返回所有列标识,使用','分隔
返回值
String
示例代码
let columnIds = this.comp("treeData").getColumnIDs();
获取所有列定义
数据组件提供 getColumnDefs 方法获取所有列定义
方法:
getColumnDefs ()
描述
返回所有列定义,JSON 格式,key 是列标识,value 是 JSON 格式,其中 label 是列名称
返回值
JSON
方法返回结果,如下图所示
示例代码
let defs = this.comp("productData").getColumnDefs();
获取当前页号
数据组件提供 getPageNumber 方法获取当前页号,说明如下
方法:
getPageNumber ()
描述:
获取当前页号,页号从1开始
返回值
Integer 页号
示例代码
let currentPage = this.comp("productData").getPageNumber();
this.comp("productData").loadPageData(currentPage);
统计方法
获取记录数
数据组件提供 count 方法获取记录数,说明如下
方法:
count (Function filterCallback)
描述:
获取记录数,计算的是前端当前已经加载的数据的记录数,不包含分页还没有加载到前端的数据
参数:
filterCallback:{Function} - 过滤的回调函数,函数需要返回 boolean,返回 true 表示行有效,缺省全部有效
回调函数给出参数 event,格式为:{'data': data对象,row:行对象}
返回值
Integer 行数
示例代码
//统计 mainData 中记录数
let count = this.comp('mainData').count();
//统计 mainData 中 fName 列包括“李”的记录数
let count = this.comp('mainData').count((ev)=>{
let v = ev.row.fName;
return v.indexOf('李')==0;
});
计算某列的和
数据组件提供 sum 方法计算某列的和,说明如下
方法:
sum(String col, Function filterCallback)
描述:
计算某列的和,计算的是前端当前已经加载的数据,不包含分页还没有加载到前端的数据
参数:
col:列标识
filterCallback:{Function} - 过滤的回调函数,函数需要返回 boolean,返回 true 表示行有效,缺省全部有效
回调函数给出参数 event,格式为:{'data': data对象,row:行对象}
返回值
数值
示例代码
console.log("计算单价合计----" + productData.sum("price"));
let sum = productData.sum("price", ({row}) => {
return row.unit == "台";
});
console.log("计算单位等于台的商品的单价合计----" + sum);
计算某列的最大值
数据组件提供 max 方法计算某列的最大值,说明如下
方法:
max(String col, Function filterCallback)
描述:
计算某列的最大值,计算的是前端当前已经加载的数据,不包含分页还没有加载到前端的数据
参数:
col:列标识
filterCallback:{Function} - 过滤的回调函数,函数需要返回 boolean,返回 true 表示行有效,缺省全部有效
回调函数给出参数 event,格式为:{'data': data对象,row:行对象}
返回值
数值
示例代码
console.log("计算单价最大值----" + productData.max("price"));
let max = productData.max("price", ({row}) => {
return row.unit == "台";
});
console.log("计算单位等于台的商品的单价最大值----" + max);
计算某列的最小值
数据组件提供 min 方法计算某列的最小值,说明如下
方法:
min(String col, Function filterCallback)
描述:
计算某列的最小值,计算的是前端当前已经加载的数据,不包含分页还没有加载到前端的数据
参数:
col:列标识
filterCallback:{Function} - 过滤的回调函数,函数需要返回 boolean,返回 true 表示行有效,缺省全部有效
回调函数给出参数 event,格式为:{'data': data对象,row:行对象}
返回值
数值
示例代码
console.log("计算单价最小值----" + productData.min("price"));
let min = productData.min("price", ({row}) => {
return row.unit == "台";
});
console.log("计算单位等于台的商品的单价最小值----" + min);
计算某列的平均值
数据组件提供 avg 方法计算某列的平均值,说明如下
方法:
avg(String col, Function filterCallback)
描述:
计算某列的平均值,计算的是前端当前已经加载的数据,不包含分页还没有加载到前端的数据
参数:
col:列标识
filterCallback:{Function} - 过滤的回调函数,函数需要返回 boolean,返回 true 表示行有效,缺省全部有效
回调函数给出参数 event,格式为:{'data': data对象,row:行对象}
返回值
数值
示例代码
console.log("计算单价平均值----" + productData.avg("price"));
let avg = productData.avg("price", ({row}) => {
return row.unit == "台";
});
console.log("计算单位等于台的商品的单价平均值----" + avg);
优化方法
开启批量处理
使用 JS 处理大量数据时,如果用时超过1秒,可以在处理方法的前面,调用数据组件的 requireBatchTransition 方法,开启批量处理,会大大缩短用时,方法说明如下
方法:
requireBatchTransition ()
描述:
开启批量处理
示例代码
this.comp("mainData").requireBatchTransition();
其他方法
数据序列化
数据组件提供 toJson 方法将数据序列化为 JSON 对象,说明如下
方法:
toJson (JSON option)
描述:
获取 JSON 格式序列化对象
参数:
option:{JSON} - 序列化参数
{
ui: {Boolean} - 是否用于界面展现, true 表示用于展现,false 用于往后端传,默认值: false
includeState: {Boolean} - 是否包含行状态, 默认值: false
excludeCalculateCol: {Boolean} - 是否不包含计算列, 默认值: false
resultType: {String} - 结果类型, 取值为 list 或 tree, 只对树形数据起作用,默认值:tree
excludeChildren: {Boolean} - 是否排除子节点, 只对树形数据起作用, 默认值: false
}
返回值:
Array(JSON)
序列化为适合作为参数的 JSON
无需参数,即可序列化为只有列标识和值的 JSON,代码如下,运行结果如下图所示
console.log(this.comp("productData").toJson());
序列化为用于界面展示的 JSON
使用 ui = true 参数,日期和时间被转换为当前时区的字符串;使用 includeState = true 参数,可以获得 _recordState。代码如下,运行结果如下图所示
console.log(this.comp("productData").toJson({ui:true,includeState:true}));
序列化树形数据为嵌套 JSON
例如有如下图的树形数据
序列化后的 JSON 使用 _syschildren 存储子节点的数据,保留树形数据的层级关系。代码如下,运行结果如下图所示
console.log(this.comp("treeData").toJson());
序列化树形数据为平板 JSON
使用 resultType = list 参数,不保留树形数据的层级关系,转换为平板数据。代码如下,运行结果如下图所示
console.log(this.comp("treeData").toJson({resultType:"list"}));
遍历数据
数据组件提供 each 方法用于遍历数据,使用 return false; 退出遍历,说明如下
方法:
each (function callback, Row parentRow)
each (function callback, String parentRow)
描述:
遍历数据,使用 return false; 退出遍历
从数据,只遍历和主当前行相关的数据行
树形数据,只遍历指定 parentRow 下面的数据,不遍历子节点中的数据
参数:
callback:{function} - 回调函数,参数如下:
{
index: {integer} - 行索引,
row: {Row} - 行对象,
data: {Data} 数据组件对象,
parent: {Row | String} 调用时传入的 parentRow 参数,当树形数据时有效
}
parentRow:{Row | String} - 树型数据遍历时指定开始遍历的父节点,支持行对象和行 id,缺省从根开始
示例代码
- 遍历中退出遍历
let names = [];
this.comp("productData").each((param)=>{
names.push(param.row.name);
return false; //退出遍历
});
- 遍历树形数据的某个父节点下的数据
let names = [];
this.comp("treeData").each((param)=>{
names.push(param.row.name);
},data.getCurrentRow());
查找数据
数据组件提供 find 方法在数据组件中查找数据
方法:
find (Array fields, Array values, Boolean first, Boolean caseInsensitive, Boolean partialKey)
描述:
根据列和值匹配进行数据查找,可以匹配多列
参数:
fields:{Array} - 列
values:{Array} - 值
first:{Boolean} - 返回第一条
caseInsensitive:{Boolean} - 忽略大小写
partialKey:{Boolean} - 模糊查询
返回值:
Array<Row> 行对象数组
查找一列
查找 fName 中包含"李"的第一条数据,代码如下
let rows = this.comp('mainData').find(['fName'],['李'],true,true,true);
if(rows.length==0) message.info('没有符合条件数据');
查找两列
查找 fName="李四" 并且 fAge=18 的数据,代码如下
let rows = this.comp('mainData').find(['fName','fAge'],['李',18]);
if(rows.length==0) message.info('没有符合条件数据');
查找日期
查找日期支持字符串和 Date 类型两种方式
- 使用 Date 类型查找,示例代码如下
let data = this.comp("productData");
let date = new Date("2024-07-15“);
let rows = data.find(["createDate"], [date]);
- 使用字符串查询,示例代码如下
let data = this.comp("productData");
let date = new Date();
let date = wx.Date.toString(date,'yyyy-MM-dd');
let rows = data.find(["createDate"], [date]);
查询日期时间
查找日期时间只支持使用 Date 类型查找,示例代码如下
let data = this.comp("productData");
let date = new Date("2024-07-15 17:48:38");
let rows = data.find(["createDateTime"], [date]);
改变当前行
数据组件中可以有多行数据,只有一行是当前行
- 表单组件展示的就是数据组件当前行的值
- 刷新数据后,第一行是当前行
- 新增数据后,新增的数据行是当前行
- 在表格或列表组件中,点击某行,某行就成为当前行
另外,还支持使用代码改变当前行
移动到指定行
数据组件提供 to 方法移动当前行到指定行,即将指定行变为当前行
方法:
to (Row | String row)
描述:
移动到指定行
参数:
row:{Row | String} - 行或者行 ID
示例代码
this.comp("detailData").to(row.id);
移动到第一行、最后一行、前一行、后一行
数据组件提供 first、last、pre、next 方法移动当前行到第一行、最后一行、前一行、后一行
加载数据
数据组件提供 loadData 方法加载数据。通常用于将其他方式返回的 json 数据,加载到数据组件中
- 对比 newData 方法
- newData 插入的数据,行状态都是 new,isChanged 方法返回 true,执行 saveAllData 这些数据都可以提交
- loadData 插入的数据,行状态都是 none,isChanged 方法返回 false,执行 saveAllData 没有数据需要提交
- 需要注意的是,此方法不设置主键的值,需要自行手动设置
- 默认是覆盖模式,会删除覆盖原来数据,如果要在原来的数据后面追加数据,需要设置 append 参数为 true
- 加载的数据,即使是 1 条数据,也需要传 json 列表 [],不能传 {},否则数据加载不进去
- 此方法只是在前端修改数据组件的内容,不涉及后端提交数据库
方法:
loadData (Array(JSON) data, JSON options)
描述:
加载数据
参数:
data:{Array(JSON)} - 需要加载的数据,格式同序列化格式
options: {JSON} - 参数,格式如下
{
index:{integer} - 加载数据的插入位置,缺省数据插入到末尾
append:{Boolean} - 是否追加模式
override:{Boolean} - 是否覆盖,当出现 id 相同的行时,是否进行数据覆盖替换
parentRow:{Row | String} - 树形数据的父节点,支持行对象或行 id,非树形不需要设置
loadAll:{Boolean} - 针对树形数据,表示是否已加载所有数据,如果为true,叶子节点不显示展开图标
buildVirtualNode:{Boolean} - 是否构建虚拟树
buildTreeData:{Boolean} - 是否构建树结构数据
}
示例代码
let current = detailData.getCurrentRow();
this.comp("inputData").loadData([current.toJson()],{buildTreeData:true});
设置总记录数
数据组件提供 setTotal 方法设置总记录数,用于给分页组件提供分页依据,说明如下
方法:
setTotal (Integer count)
描述:
设置总记录数,包括分页没有加载的记录数
参数:
count:{Integer} - 总记录数
示例代码
this.comp("inputData").setTotal(100);
判断数据是否存在
数据组件提供 exist 和 existID 方法判断数据是否存在,用于添加数据之前的检查,说明如下
方法:
exist (Row row)
描述:
根据行对象判断行是否存在
参数:
row:{Row} - 数据组件的行对象
返回值:
Boolean
示例代码
let data = this.comp("selectData");
let row = data.getCurrentRow();
if(data.exist(row)){
message.info("数据已存在!");
}
});
方法:
existID (String rowid)
描述:
根据行 id 判断行是否存在
参数:
rowid:{String} - 行 id
返回值:
Boolean
示例代码
let selectData = this.comp("selectData");
let dialogData = this.comp("dialogData");
dialogData.each((option)=>{
let row = option.row;
let rowid = option.data.getRowID(row);
if(!selectData.existID(rowid)){
await selectData.newData();
let newRow = selectData.getCurrentRow();
Object.assign(newRow,row);
}
});