data组件,是前端model上的数据核心。可以控制数据的各种类型,规则,变化,操作等,极大简化了开发者写代码对数据的维护。其他显示组件绑定data组件后,就可以跟随data组件数据的变化,自动改变页面显示的数据。实现了开发者面向数据编程,使开发更加简单明了,方便直接!
目录
一、综述
二、DOM结构
三、样式
四、属性
五、方法
六、事件
七、操作
八、案例
一. 综述
data组件是前端model上的数据核心。可以控制数据的各种类型,规则,变化,操作等,极大简化了开发者写代码对数据的维护。其他显示组件绑定data组件后,就可以跟随data组件数据的变化,自动改变页面显示的数据。实现了开发者面向数据编程,使开发更加简单明了,方便直接。关于data组件基础的详细介绍,还可以参考:http://doc.wex5.com/?p=9540。
组件路径:/UI2/system/components/justep/data
组件标识:$UI/system/components/justep/data/data
可实现以下功能:
- data组件中静态数据的修改和显示
- 简单操作控制data数据的变化
- data组件编辑规则设置
- 通过baas实现data组件和数据库的交互
- data组件树形设置
二. DOM结构
- 典型dom结构
<div component="$UI/system/components/justep/model/model" xid="model"> <div component="$UI/system/components/justep/data/data" autoLoad="true" xid="data" idColumn="col0" autoNew="false" limit="10" confirmDelete="true" confirmDeleteText="确定删除吗" confirmRefresh="false" confirmRefreshText="确定刷新" isTree="false"> <column label="列0" name="col0" type="String" xid="xid1"/> <column label="列1" name="col1" type="Integer" xid="xid2"/> <column label="列2" name="col2" type="Long" xid="xid3"/> <column label="列3" name="col3" type="Float" xid="xid4"/> <column label="列4" name="col4" type="Double" xid="xid5"/> <column isCalculate="true" label="列5" name="col5" type="Decimal" xid="xid6"/> <column isCalculate="true" label="列6" name="col6" type="Boolean" xid="xid7"/> </div> </div>
- 树形dom结构
<!--data树形结构设置--> <div component="$UI/system/components/justep/data/data" autoLoad="false" xid="regionData" idColumn="fID" isTree="true"<!--设置data组件为树形结构--> onCustomRefresh="regionDataCustomRefresh" limit="-1"> <!--设置dats的树形父关系为fParentID,并且一次性加载数据--> <treeOption xid="default1" parentRelation="fParentID" delayLoad="false"/> <column label="fID" name="fID" type="String" xid="default2"/> <column label="fName" name="fName" type="String" xid="default3"/> <column label="fParentID" name="fParentID" type="String" xid="default4"/> <column label="fType" name="fType" type="String" xid="default5"/> </div>
- 从表数据dom结构
<!--data树形结构设置--> <div component="$UI/system/components/justep/data/data" autoLoad="true" xid="detailData" idColumn="id"> <column label="id" name="id" type="Integer" xid="xid8"> </column> <column label="fMasterID" name="fMasterID" type="Integer" xid="xid9"> </column> <column label="列1" name="col1" type="String" xid="xid10"></column> <column label="列2" name="col2" type="String" xid="xid11"></column> <column isCalculate="false" label="列3" name="col3" type="String" xid="xid12"> </column> <master xid="default2" data="主数据dataXid" relation="fMasterID"></master> </div>
三. 样式
- 无
四. 属性
组件具有公共属性,请参考组件公共属性
- STATE
[object][static]data的状态常量包括:Data.STATE.NEW、Data.STATE.DELETE、Data.STATE.EDIT、Data.STATE.NONE,使用的时候需要引入data:
var Data = require(“$UI/system/components/justep/data/data”),后面介绍的一些方法中就使用到了STATE,
- autoLoad
[boolean][设计时属性]是否自动加载数据,值为true,表示页面初始化后自动把数据加载到data组件中,值为false,不会自动加载数据到data组件中,当调用data组件的刷新方法时才会去加载数据。此属性和autoNew不能同时设置为true
- autoNew
[boolean][设计时属性]是否自动新增数据,值为true,表示当页面初始化后,自动新增一行,不能和autoLoad同时设置为true。值为false则不会自动新增行!
- confirmDelete
[boolean]删除确认提示,值为true,删除数据是会提示是否删除数据的信息,以免误删数据,值为false,则直接删除,不会做任何提示。
- confirmDeleteText
[string]删除数据时设置的提示文字,如果confirmDelete设置为true,则可以显示,设置为false,则此设置不起作用。
- confirmRefresh
[boolean]数据修改后未保存刷新时的确认提示,设置为true,当数据编辑后还未保存,刷新数据时,会提示没有保存的数据会丢失,防止不小心刷新页面,丢失了刚刚录入的数据。如果设置为false,不会做任何提示,页面直接同步成数据库中的数据
- confirmRefreshText
[string]未保存数据刷新确认提示文本,如果confirmRefresh为true,刷新页面未保存会提示此属性设置的文字,confirmRefresh设置为false,则此设置不起作用
- defCols
[object]data的列定义,是运行时data组件js对象上所有列的定义,只能在运行时才可以使用此属性,用来查看列的定义
- directDeleteMode
[boolean]直接删除方式,删除时直接进行数据提交,当为false时删除记录将在saveData时统一提交
- limit
[integer]分页取数据的页记录数,等于-1时不执行分页一次取全部数据,运行时谨慎修改,会影响数据导航条分页取数据状态
- slaveDatas
[array]从data的id数组,运行时可以使用此属性得到所有从data,从而可以使用js得到这条记录的所有数据
- isTree
[boolean]是否树形数据,设置为true,表示以树形结构存放数据,配合树形组件使用
- master
主从关系:data 主Data对象,column 关联关系。从表需要设置此属性。
- rule
规则,可以定义列的只读规则(readonly)、计算规则(calculate)、必填规则(required)、约束规则(constraint)
只读规则包含expr表达式部分,当表达式计算结果为True时只读,当只读定义在rule根下时为整个data的只读规则
计算规则包含expr表达式部分,对应列的值来自于表达式计算结果
必填规则包含expr表达式部分和message提示部分,当表达式计算结果为True时该列为必填,没有填写数据违反必填规则时提示message信息
约束规则包含expr表达式部分和message提示部分,当表达式计算结果为False时违反约束规则提示message信息
xml格式说明:
<!--data的只读规则定义-->
js:true
<col>
<!--fDecimal列的只读规则定义-->
js:true
<!--fDecimal列的计算规则定义-->
js:$model.slaveData?$model.slaveData.sum('fDecimal',$row):0
</col>
<col>
<!--fString列的必填规则定义-->
js:true
fString不能为空
<!--fString列的计算规则定义-->
js:$val[0]=='A'
fString第一个字符必须为'A'
</col>
- treeOption
包括属性:
parentRelation [attribute] 父关系,形成父子树的父关系
rootFilter [attribute] 根过滤条件,当设置时树形数据将按节点加载数据
delayLoad [attribute] 延迟数据加载,默认值为true
nodeKindRelation [attribute] 节点类型关系,data操作时使用指定relation自动记录是否叶子节点信息
xml格式:
五. 方法
组件具有公共方法,请参考组件公共方法
- add
void add (object defaultValue, Row parent)
前端新增一行数据,状态需要开发者设定
> 参数
defaultValue: [json]属性值对,表示要新增的数据
> 结构如下:
{
列名:值,
列名:值,
...
}
parent: [Row]如果是树形数据,新增一行时需要指定父的行对象,如果不是树形则不使用此参数。
> 返回值
void
> 例:
var data = this.comp('data');
var defaultValue = {
col1:'第一列',
col2:'第二列',
col3:'第三列',
col4:'第四列'
};
data.newData(defaultValue);
- applyUpdates
void applyUpdates ()
进行数据状态的更新,设置data的数据行状态,如:清除删除行,清除编辑状态,版本号维护;通常在数据提交服务端成功后调用
> 参数
无
> 返回值
void
> 例:
//在data组件的onCustomSave方法中使用baas保存数据时,如果保存成功,调用此方法更新数据状态
Model.prototype.userDataCustomSave = function(event) {
var data = event.source;
var params = {
"data" : data.toJson(true)
};
var success = function(resultData) {
// 保存成功后,必须调用data.applyUpdates(),用于数据集确认数据已更新
data.applyUpdates();
};
Baas.sendRequest({
"url" : "/demo",
"action" : "saveUser",
"params" : params,
"success" : success
});
};
- avg
number avg (string column, function filterCallback)
获取data中指定列的平均值,函数返回的是前端当前已经加载记录的平均值,不包含分页还没有加载到前端的数据,注意:返回的数值精度受js的number精度影响(如果从data,只计算和主关联的从数据)
> 参数
column: [string]进行统计的列的名称
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中年龄fAge平均值
var avg = this.comp('mainData').avg('fAge');
//统计mainData中fName姓“李”的年龄fAge平均值
var avg = this.comp('mainData').avg('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- avgByAll
number avgByAll (string column, function filterCallback)
获取data中指定列的平均值,(如果从data,按全部从数据计算)
> 参数
column: [string]进行统计的列的名称
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中年龄fAge平均值
var avg = this.comp('mainData').avgByAll('fAge');
//统计mainData中fName姓“李”的年龄fAge平均值
var avg = this.comp('mainData').avgByAll('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- buildFilter
string buildFilter()
生成返回过滤字符串
> 参数
无
> 返回值
string
> 例:
//使用此方法可以在运行时看到设置的过滤条件的字符串
this.comp('data').buildFilter();
- clear
void clear()
清空data的所有数据,会触发data的onDataChanged事件
> 参数
无
> 返回值
void
> 例:
//清空data的所有数据。
this.comp('data').clear();
- clearOrderBy
void clearOrderBy()
清除data上的OrderBy定义
> 参数
无
> 返回值
void
> 例:
//清空data的所有数据。
this.comp('data').clearOrderBy();
- count
number count(function filterCallback)
获取data的记录数,函数返回的是前端当前已经加载的数据的记录数,不包含分页还没有加载到前端的数据(如果从data,只计算和主关联的从数据)
> 参数
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中记录数
var count = this.comp('mainData').count();
//统计mainData中fName姓“李”的记录数
var count = this.comp('mainData').count(function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- countByAll
number countByAll (function filterCallback)
获取data的全部记录数(如果从data,按全部从数据计算)
> 参数
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中记录数
var count = this.comp('mainData').countByAll();
//统计mainData中fName姓“李”的记录数
var count = this.comp('mainData').countByAll(function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- deleteAllData
void deleteAllData()
删除data所有数据,感知directDeleteMode和confirmDelete属性设置
> 参数
无
> 返回值
void
> 例:
//删除mainData中所有数据
var count = this.comp('mainData').deleteAllData();
});
- deleteAllData
boolean deleteData(List rows, Object options)
业务数据删除方法,当directDeleteMode=true时直接提交后台删除,当confirmDelete=true时会弹出删除确认框
> 参数
rows:[List]行数组,缺省当前行
options:[Object]删除参数,结构如下
{
"async" : {boolean} - 异步执行,默认:false,
"confirm" : {boolean} - 删除确认提示,缺省使用属性confirmDelete
"onError" : {function} - 失败回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象,
"errorType" : {string} - 'server',
"errorNode" : {object} - 错误信息,
"httpError" : {boolean} - 是否http请求失败,
"httpState" : {string} - http请求返回码
}
"onSuccess" : {function} - 成功回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象
}
}
> 返回值
boolean
> 例:
//不提示直接提交后台删除当前行
var data = this.comp('mainData');
var confirmDelete = data.confirmDelete;
var directDeleteMode = data.directDeleteMode;
try{
data.confirmDelete = false;
data.directDeleteMode = true;
data.deleteData(data.getCurrentRow());
}finally{
data.confirmDelete = confirmDelete;
data.directDeleteMode = directDeleteMode;
}
});
- disableRecordChange
void disableRecordChange()
禁止data数据修改状态变化
> 参数
无
> 返回值
void
> 例:
//禁止data数据修改状态变化
var data = this.comp('mainData').disableRecordChange();
- doDeleteAfter
void doDeleteAfter(boolean success, Object options, Object params)
业务数据删除后函数,当实现onCustomDelete,并且是异步调用,需要开发者在回调方法中,根据成功失败调用此方法,此方法会触发onAfterDelete和onDeleteError事件。同步则不需要调用此方法。
> 参数
success:[boolean]删除是否成功,true/false
options:[Object]删除参数,同deleteData函数的options参数
params:[Object]开发者传递的参数,可在onAfterDelete、onDeleteError事件或者onSuccess、onError回调接收使用
> 返回值
void
> 例:
Model.prototype.masterDataCustomDelete = function(event){
var data = event.source;
//手动进行异步删除时,执行成功后调用doDeleteAfter。
$.ajax({
type: "GET",
url: require.toUrl(url),
dataType: 'json',
async: true,
success: function(result){
data.doDeleteAfter(result, event.options)
},
});
};
- doRefreshAfter
void doRefreshAfter(boolean success, Object options, Object params)
业务数据刷新后函数,当异步实现onCustomDelete后需要开发者根据成功失败调用
> 参数
success:[boolean]刷新是否成功,true/false
options:[Object]刷新参数,同refreshData函数的options参数
params:[Object]开发者传递的参数,可在onAfterRefresh、onRefreshError事件或者onSuccess、onError回调接收使用
> 返回值
void
> 例:
Model.prototype.masterDataCustomRefresh = function(event){
var data = event.source;
//手动进行异步刷新时,执行成功后调用doRefreshAfter。
$.ajax({
type: "GET",
url: require.toUrl(url),
dataType: 'json',
async: true,
success: function(result){
data.doRefreshAfter(result, event.options)
}
});
};
- doSaveAfter
void doSaveAfter(boolean success, Object options, Object params)
当实现异步数据保存时,通过函数来完成保存后的逻辑
> 参数
success:[boolean]保存是否成功,true/false
options:[Object]保存参数,同saveData函数的options参数
params:[Object]开发者传递的参数,可在onAfterSave、onSaveError事件或者onSuccess、onError回调接收使用
> 返回值
void
> 例:同上do After方法
- each
void each (function callback)
遍历当前data的数据,如果是从Data,只遍历和主当前行相关的数据行
> 参数
callback:[callback]回调函数,执行回调函数的this缺省是row对象,或者可以通过caller指定
>回调函数给出参数param格式:
{
index: {integer} 行索引,
row: {$UI/system/components/justep/data/data#Row} 行对象,
cancel: {boolean} 是否忽略遍历,
parent: {$UI/system/components/justep/data/data#Row} 行的父对象,当树形数据时有效
//caller {object} 执行callback的this,缺省为:遍历行对象 parent //{$UI/system/components/justep/data/data#Row}
//树型数据遍历时指定开始遍历的父节点行,缺省从根开始
}
> 返回值
void
> 例:
var names = [];
this.comp('mainData').each(function(param){
names.push(param.row.val('fName'));
});
- eachAll
void eachAll(function callback)
遍历当前data的全部数据
> 参数
callback:[callback]回调函数,执行回调函数的this缺省是row对象,或者可以通过caller指定
>回调函数给出参数param格式:
{
index: {integer} 行索引,
row: {$UI/system/components/justep/data/data#Row} 行对象,
cancel: {boolean} 是否忽略遍历,
parent: {$UI/system/components/justep/data/data#Row} 行的父对象,当树形数据时有效
//caller {object} 执行callback的this,缺省为:遍历行对象 parent //{$UI/system/components/justep/data/data#Row}
//树型数据遍历时指定开始遍历的父节点行,缺省从根开始
}
> 返回值
void
> 例:
var names = [];
this.comp('mainData').eachAll(function(param){
names.push(param.row.val('fName'));
});
- enabledRecordChange
void enabledRecordChange()
启用data数据修改状态变化,与disableRecordChange 方法作用相反
> 参数
无
> 返回值
void
> 例:
//禁止data数据修改状态变化
var data = this.comp('mainData').enabledRecordChange();
- exchangeRow
void exchangeRow (Row row1, Row row2)
数据行进行交换位置
> 参数
row1:[Row]行对象
row2:[Row]行对象
> 返回值
void
> 例:
//根据id的到对应的行,并交换两个行的位置
var data = this.comp('mainData');
var row1 = data.getRowByID('id1');
var row2 = data.getRowByID('id5');
data.exchangeRow(row1,row2)
- exist
boolean exist(string rowID)
判断行是否存在,只判断当前已经加载的数据
> 参数
rowID:[string]根据行的id进行判断,参数为空表示当前行
> 返回值
boolean
> 例:
var data = this.comp('mainData');
if(data.exist('id3')){
alert('id为id3的一行数据是存在的')
}else{
alert('不存在id为id3的数据行')
}
- find
List find (List fields, List values, boolean first, boolean caseInsensitive, boolean partialKey, boolean all)
数据查找,根据列和值匹配进行数据查找,可以匹配多列
> 参数
fields:[List]列列表,必填
values:[List]值列表,必填
first:[boolean]是否只返回第一条数据
caseInsensitive:[boolean]是否忽略大小写
partialKey:[boolean]是否模糊查询
all:[boolean]data所有数据查找,当是从Data时all==false只查找和主关联的行数据
> 返回值
List
> 例:
//查找fName中包含"李"的提一条数据
var rows = this.comp('mainData').find(['fName'],['李'],true,true,true);
if(rows.length==0) alert('没有符合条件数据');
//查找fName="李四",fAge=18的数据
var rows = this.comp('mainData').find(['fName','fAge'],['李',18]);
if(rows.length==0) alert('没有符合条件数据');
- first
void first ()
移动到第一条
> 参数
无
> 返回值
void
> 例:
this.comp('data').first();
- last
void last ()
移动到最后一条
> 参数
无
> 返回值
void
> 例:
this.comp('data').last();
- getAggregateValue
object getAggregateValue(string col)
通过统计列名获取统计值,需要在后台自己返回统计值,详细请参考bizData的实现方法,queryAction的aggregate参数定义:后端queryAction的aggregate参数定义:count(SA_OPPerson) as personCount
> 参数
col:[string]根据统计列名,得到得到统计值
> 返回值
string
> 例:
this.comp('mainData').getAggregateValue('personCount')
- getColumnIDs
string getColumnIDs()
返回使用’,’分隔的data所有列名
> 参数
无
> 返回值
string
> 例:
this.comp('mainData').getColumnIDs();
- getCount
integer getCount(Row parent)
获取data记录数
> 参数
parent:[Row]树形数据的父
> 返回值
integer
> 例:
this.comp('mainData').getCount();
- getCurrentRow
void getCurrentRow(boolean peek)
获取data当前的行
> 参数
peek:[boolean]不影响bind计算链,即想获取当前行但是又不感知当前行变化时可以使用getCurrentRow(true)获取当前行
> 返回值
void
> 例:
this.comp('mainData').getCurrentRow();
- getCurrentRowID
void getCurrentRowID()
获取data当前的行ID
> 参数
无
> 返回值
void
> 例:
this.comp('mainData').getCurrentRowID();
- getFirstRow
Row getFirstRow()
获取data的第一行,没有数据时返回null
> 参数
无
> 返回值
Row
> 例:
this.comp('mainData').getFirstRow();
- getInvalidInfo
string getInvalidInfo()
获取data违反约束的信息,常常配合isValid使用
> 参数
无
> 返回值
string
> 例:
var data = this.comp('data');
var isValid = data.isValid();
if(!isValid){
throw new Error (data.getInvalidInfo());
}
- getLastRow
Row getLastRow()
获取data的最后一行,没有数据时返回null
> 参数
无
> 返回值
Row
> 例:
this.comp('mainData').getLastRow();
- getOffset
integer getOffset(Row parent)
返回data加载数据的偏移量,加载数据时将偏移量和limit传递到后台,来获取下一页的数据
> 参数
parent:[Row]树形数据的父
> 返回值
Row
> 例:
this.comp('mainData').getOffset();
- getOriginalValue
object getOriginalValue (string col, Row row)
通过列名和行获取列的原值,保存前获取修改后列原值,保存后同getValue取的值
> 参数
col:[string]列名称
row:[Row]行,默认:当前行
> 返回值
object
> 例:
//查看当前行姓名
var data = this.comp('mainData');
data.getOriginalValue('fName');
- getReadonly
boolean getReadonly()
返回data只读状态
> 参数
无
> 返回值
boolean
> 例:
var isReadonly = this.comp('mainData').getReadonly();
- getRowByID
Row getRowByID (string rowid)
根据行ID获取Row,函数会遍历所有数据,不要在循环中大量使用以免引发性能问题
> 参数
rowid:[string] 行id,就是data定义中的id列的值
> 返回值
Row
> 例:
//根据id得到该行,然后可以查看修改这行的任意值
var data = this.comp('mainData');
var row = data.getRowByID();
var name = data.getValue('fName',row);
- getRowID
object getRowID(Row row)
获取data的行Id,默认获取当前行的id
> 参数
row:[Row] 行对象
> 返回值
object:data上列能定义的类型都可以
> 例:
//获取当前行的id
var rowID = this.comp('mainData').getRowID();
- getRowIndex
integer getRowIndex(Row row)
获取data的行索引,表示第几条数据,从0开始
> 参数
row:[Row] 行对象,必填,否则返回-1
> 返回值
integer
> 例:
//获取当前行的索引
var data = this.comp('mainData');
var index = data.getRowIndex(data.getCurrentRow());
- getTotal
integer getTotal(Row parent)
返回data的全部记录数,包括分页没有加载的记录数,可以后台java使用table.setTotal设置总记录数并返回
> 参数
parent:[Row] 父的行对象,如果是树形结构需要此参数,否则不需要传递此参数
> 返回值
integer
> 例:
//获取data的总记录数
var count = this.comp('mainData').getTotal();
- getTreeOption
object getTreeOption ()
获取树的定义信息
> 参数
无
> 返回值
object:包括属性(isDelayLoad 数据分级加载,进入叶子节点进行数据加载 parentRelation 父关系,形成父子树的父关系 rootFilter 根过滤条件,当设置时树形数据将按节点加载数据 nodeKindRelation 节点类型关系,data操作时使用指定relation自动记录是否叶子节点信息)
> 例:
//修改根过虑条件
var treeData = this.comp('treeData');
treeData.getTreeOption().rootFilter="GoodsType.fTypeName='服装'";
- setValue
void setValue (string col, object value, Row row)
通过列名和行设置列的值
> 参数
col:[string]必填,列名称。
value:[object]必填,值。
row:[Row]行对象,默认当前行
> 返回值
void
> 例:
//设置当前行姓名是小明。
var data = this.comp('mainData');
data.setValue('fName','小明');
- getValue
object getValue (string col, Row row)
> 参数
col:[string]必填,列的名称,
row:[Row]行对象。不填此参数默认表示当前行
> 返回值
object
> 例:
//获取当前行的名称值
var name = this.comp('mainData').getValue('fName');
- isCalculateCol
boolean isCalculateCol(string col)
判断列是否为计算列
> 参数
col:[string]必填,列的名称,
> 返回值
boolean
> 例:
//判断fName是否为计算列
var isCalculateCol = this.comp('mainData').isCalculateCol('fName');
if(isCalculateCol){
alert('fName为计算列');
}
- isChanged
boolean isChanged()
判断data是否修改,包括从data的修改状态
> 参数
无
> 返回值
boolean
> 例:
//判断data是否修改
var isChanged = this.comp('mainData').isChanged();
if(isChanged){
alert('mainData已经修改过了');
}
- isLeaf
boolean isLeaf(Row row)
判断给定行是不是叶子节点
> 参数
row:[Row]行对象
> 返回值
boolean
> 例:
//获取当前行是否是叶子节点
var data = this.comp('mainData');
var isLeaf = data.isLeaf(data.getCurrentRow());
- isSelfChanged
boolean isSelfChanged()
判断data自身是否修改
> 参数
无
> 返回值
boolean
> 例:
//获取data自身是否修改
var isSelfChanged = this.comp('mainData').isSelfChanged();
- isSlaveChanged
boolean isSlaveChanged()
判断从data是否修改
> 参数
无
> 返回值
boolean
> 例:
//获取从data是否修改
var isSlaveChanged = this.comp('mainData').isSlaveChanged();
- isTree
boolean isTree()
判断当前data是不是tree数据
> 参数
无
> 返回值
boolean
> 例:
//获取data是否是树形数据
var isTree = this.comp('mainData').isTree();
- isValid
boolean isValid()
判断data是否违反约束
> 参数
无
> 返回值
boolean
> 例:
//判断是否违反约束并抛出错误异常
var data = this.comp('data');
var isValid = data.isValid();
if(!isValid){
throw new Error (data.getInvalidInfo());
}
- label
string label(string col)
通过列名获取显示名称
> 参数
col:[string]列名称
> 返回值
string
> 例:
//获取fName对应的lable显示,结果一般为中文,比如“名称”
var lable= this.comp('data').lable('fName');
alert(lable);
- loadAllPageData
boolean loadAllPageData(Object options)
在分页状态加载所有数据,如果是自己实现onCustomRefresh事件,event.limit将会变成总的记录数。
> 参数
options:[object] 刷新参数
> 结构如下:
{
"onError" : {function} // 失败回调,function(event),
//event的格式:
{
"source" : {Data} //组件的js对象,
"errorType" : {string} // 'server',
"errorNode" : {object} // 错误信息,
"httpError" : {boolean} // 是否http请求失败,
"httpState" : {string} // http请求返回码
}
"onSuccess" : {function} // 成功回调,function(event),
//event的格式:
{
"source" : {Data} // 组件的js对象
}
}
> 返回值
boolean
> 例:
this.comp('data').loadAllPageData({
onSuccess:function(event){
var count = event.source.count();
alert('总数是'+count);
},
onError::function(event){
alert('刷新失败,错误是:'+event.errorNode);
},
});
- loadData
void loadData(object data,boolean append,Row parent,integer index)
加载数据
> 参数
data:[object] 需要加载的Json数据,格式同bass返回的table结构数据或biz层序列化格式
append:[boolean]数据增加模式 true/false,true表示在原来数据的基础上新增,false表示将原来数据清除,再放入新的数据。
parent:[Row] 如果是树型结构,需要将父的行对象传递进去,新的数据作为子数据。
index:[integer] 将数据新增到指定索引的位置。
> 返回值
void
> 例:
//baas案例中,返回数据成功后,调用此方法给data加载数据 data.loadData(resultData, append);
- loadData
void loadData(object data,boolean append,Row parent,integer index)
加载数据
> 参数
data:[object] 需要加载的Json数据,格式同bass返回的table结构数据或biz层序列化格式
append:[boolean]数据增加模式 true/false,true表示在原来数据的基础上新增,false表示将原来数据清除,再放入新的数据。
parent:[Row] 如果是树型结构,需要将父的行对象传递进去,新的数据作为子数据。为null时数据加载到根下
index:[integer] 将数据新增到指定索引的位置。缺省数据插入到末尾
> 返回值
void
> 例:
//baas案例中,返回数据成功后,调用此方法给data加载数据 data.loadData(resultData, append);
- loadNextPageData
boolean loadNextPageData (Object options)
加载下一页的数据,受offset、limit影响,如果是自己实现onCustomRefresh事件,根据limit和offset传递的值,可指定下一页数据
> 参数
options:[object] 刷新参数
> 结构如下:
{
"onError" : {function} // 失败回调,function(event),
//event的格式:
{
"source" : {Data} //组件的js对象,
"errorType" : {string} // 'server',
"errorNode" : {object} // 错误信息,
"httpError" : {boolean} // 是否http请求失败,
"httpState" : {string} // http请求返回码
}
"onSuccess" : {function} // 成功回调,function(event),
//event的格式:
{
"source" : {Data} // 组件的js对象
}
}
> 返回值
boolean
> 例:
this.comp('data').loadNextPageData({
onSuccess:function(event){
alert('成功');
},
onError::function(event){
alert('刷新失败,错误是:'+event.errorNode);
},
});
- loadPageData
boolean loadPageData (integer pageIndex, Object options)
分页模式下加载第N页数据
> 参数
pageIndex:[integer]页索引。必填,表示刷新第几页。
options:[object] 刷新参数
> 结构如下:
{
"async" : {boolean} - 异步执行,默认:false,
"confirm" : {boolean} - 刷新提示,缺省使用属性confirmRefresh
"onError" : {function} - 失败回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象,
"errorType" : {string} - 'server',
"errorNode" : {object} - 错误信息,
"httpError" : {boolean} - 是否http请求失败,
"httpState" : {string} - http请求返回码
}
"onSuccess" : {function} - 成功回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象
}
}
> 返回值
boolean
> 例:
//切换到第5页
this.comp('data').loadPageData(5);
- max
number max (string column, function filterCallback)
获取data中指定列的最大值,函数返回的是前端当前已经加载记录的最大值,不包含分页还没有加载到前端的数据,注意:返回的数值精度受js的number精度影响(如果从data,只计算和主关联的从数据)
> 参数
column:[string]进行统计的列
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中年龄fAge最大值
var min = this.comp('mainData').max('fAge');
//统计mainData中fName姓“李”的年龄fAge最大值
var avg = this.comp('mainData').max('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- maxByAll
number maxByAll (string column, function filterCallback)
获取data中指定列的最大值,(如果从data,按全部从数据计算)
> 参数
column:[string]进行统计的列
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中所有数据年龄fAge最大值
var min = this.comp('mainData').maxByAll('fAge');
//统计mainData中所有数据fName姓“李”的年龄fAge最大值
var avg = this.comp('mainData').maxByAll('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- min
number min (string column, function filterCallback)
获取data中指定列的最小值,函数返回的是前端当前已经加载记录的最小值,不包含分页还没有加载到前端的数据,注意:返回的数值精度受js的number精度影响(如果从data,只计算和主关联的从数据)
> 参数
column:[string]进行统计的列
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中年龄fAge最小值
var min = this.comp('mainData').min('fAge');
//统计mainData中fName姓“李”的年龄fAge最小值
var avg = this.comp('mainData').min('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- minByAll
number minByAll(string column, function filterCallback)
获取data中指定列的最小值,(如果从data,按全部从数据计算)
> 参数
column:[string]进行统计的列
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中全部数据年龄fAge最小值
var min = this.comp('mainData').minByAll('fAge');
//统计mainData中全部数据fName姓“李”的年龄fAge最小值
var avg = this.comp('mainData').minByAll('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- newData
List newData (Object options)
业务数据新增方法,支持返回多行
> 参数
options:[Object ]新增参数,支持多行新增
> 结构如下:
{
"parent" : Row - 树形数据的父(非树形不需要),
"index" : integer - 新增数据的位置,缺省新增到最后,
"defaultValues" : array - 新增行的默认值数组 ,数组的长度决定新增行数,数组中的对象是列的默认值
defaultValues格式:
[
{列名:默认值,...},
{列名:默认值,...},
...
]
"onError" : function - 失败回调函数,function(event);
event的格式:
{
"source" : {Data} - 组件的js对象,
"errorType" : {string} - 'server',
"errorNode" : {object} - 错误信息,
"httpError" : {boolean} - 是否http请求失败,
"httpState" : {string} - http请求返回码
}
"onSuccess" : function - 成功回调函数,function(event);
event的格式:
{
"source" : {Data} - 组件的js对象,
"rows" : {List} - 新增行的数组
}
}
> 返回值
List:返回新增行的rows
> 例:
//新增两行数据
var data = this.comp('detailData');
data.newData({
defaultValues : [ {
col1 : 1,
col2 : 'test',
col3 : true,
col4 : 5.2
}, {
col1 : 2,
col2 : 'hello',
col3 : false,
col4 : 5.5
}]
});
- next
void next()
移动到下一条
> 参数
无
> 返回值
void
> 例:
this.comp('mainData').next();
- open
void open()
当data.isLoaded()!=true时执行data的refreshData
> 参数
无
> 返回值
void
> 例:
this.comp('mainData').open();
- pre
void pre()
移动到前一条
> 参数
无
> 返回值
void
> 例:
this.comp('mainData').pre();
- val
object val(string col, Row row)
通过列名和行获取值等同于getValue
> 参数
col:[string]列名称,必填
row:[Row]行对象,默认表示当前行
> 返回值
object
> 例:
//获取当前行的姓名
var name = this.comp('mainData').val('fName');
- ref
object ref(string col, Row row)
通过列名获取列绑定对象
> 参数
col:[string]列名称,必填。
row:[Row]行对象,不填此参数默认为当前行。
> 返回值
object
> 例:
var name = this.comp('mainData').ref('fName');
- setValueByID
void setValueByID (string col, object value, string rowid)
通过列名和行设置列的值,函数会遍历所有数据,不要在循环中大量使用以免引发性能问题
> 参数
col:[string]必填,列名称。
value:[object]必填,值。
row:[Row]行ID,默认:当前行ID
> 返回值
void
> 例:
//设置行id为123的行的字段fName的值是小明。
var data = this.comp('mainData');
data.setValueByID('fName','小明','123');
- getValueByID
object getValueByID(string col, string rowid)
通过列名和行ID获取列的值,函数会遍历所有数据,不要在循环中大量使用以免引发性能问题
> 参数
col:[string]必填,列的名称,
rowid:[string]行id的值,先通过id找到指定行,然后再去找指定的列
> 返回值
object
> 例:
//获取id为123的那一行的名称值
var name = this.comp('mainData').getValueByID('fName','123');
- refreshData
boolean refreshData (Object options)
业务数据刷新,会刺激从data级联刷新,当limit!=-1时取第一页数据,当limit=-1时取全部数据,当confirmRefresh=true并且数据是编辑或者新增状态时刷新数据时显示刷新确认提示框
> 参数
options:[Object]刷新参数。结构如下
{
"async" : {boolean} - 异步执行,默认:false,
"confirm" : {boolean} - 刷新提示,缺省使用属性confirmRefresh
"onError" : {function} - 失败回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象,
"errorType" : {string} - 'server',
"errorNode" : {object} - 错误信息,
"httpError" : {boolean} - 是否http请求失败,
"httpState" : {string} - http请求返回码
}
"onSuccess" : {function} - 成功回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象
}
}
> 返回值
boolean
> 例:
//强制刷新data
var data = this.comp('mainData');
var confirmRefresh = data.confirmRefresh;
try{
data.confirmRefresh = false;
data.refreshData();
}finally{
data.confirmRefresh = confirmRefresh;
}
- remove
void remove (Row row)
移除一行数据,只在前端移除不影响数据库
> 参数
row:[Row]行对象,必填。
> 返回值
void
> 例:
//删除当前行
var data = this.comp('mainData');
data.remove(data.getCurrentRow());
- saveData
boolean saveData (Object options)
业务数据保存方法,向后端提交修改的数据,包括从Data数据
> 参数
options:[Object]新增参数,参数格式:
{
"onError" : {function} - 失败回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象,
"errorType" : {string} - 'server',
"errorNode" : {object} - 错误信息,
"httpError" : {boolean} - 是否http请求失败,
"httpState" : {string} - http请求返回码
}
"onSuccess" : {function} - 成功回调,function(event),
event的格式:
{
"source" : {Data} - 组件的js对象
}
"ignoreInvalid" : {boolean} - 保存时忽略有效性校验,默认false
"onlySelf" : {boolean} - 只保存自己不保存从
}
> 返回值
boolean
> 例:
//保存成功后刷新data
this.comp('mainData').saveData(
{
"onSuccess" : function(event){
event.source.refreshData();
}
});
- setFilter
void setFilter(string name, string filter)
设置指定名称的过滤表达式,所有的过滤将按and连接
> 参数
name:[string]过滤名称,必填。
filter:[string]必填,过滤表达式,标准的KSQL语法,如:SA_OPPerson.sName like ‘%李%’
> 返回值
void
> 例:
var data = this.comp('mainData');
data.setFilter('filter1',"SA_OPPerson.sName like '%李%'");
data.setFilter('filter2',"SA_OPPerson.sCode = :operatorCode() or SA_OPPerson.sCode = :code");
//给变参code赋值
data.filters.setStringVar("code","code_abc");
//最终qureyAction的KSQL中where部分将增加
and ((SA_OPPerson.sName like '%李%') and (SA_OPPerson.sCode = :operatorCode()
or SA_OPPerson.sCode = 'code_abc'))
- getFilter
string getFilter(string name)
返回指定名称的过滤表达式
> 参数
name:[string] 过滤名称
> 返回值
string
> 例:
//可以先使用setFilter方法设置过滤条件,这样就可以取得过滤条件了。
this.comp('mainData').getFilter("filter");
- setOrderBy
void setOrderBy(string relation, integer type)
设置查询排序
> 参数
relation:[string]关系名,必填。
type:[integer]OrderBy的类型0:DESC/1:ASC,为null时清空对应关系的排序
> 返回值
void
> 例:
//设置姓名升序排列
this.comp('mainData').setOrderBy('fName',1);
- getOrderBy
integer getOrderBy(string relation)
获取查询排序,需要后台自己实现,添加上排序的类型,前台才可以查询到
> 参数
relation:[string]关系名称
> 返回值
integer:OrderBy的类型0:DESC/1:ASC
> 例:
//查看姓名的排序方式是什么,0表示降序,1表示升序
this.comp('mainData').getOrderBy('fName');
- setRowState
void setRowState (Row row, Data.STATE state)
设置行的状态,特殊说明:不能设置delete状态,使用deleteData函数实现
> 参数
row:[Row]行对象,必填。表示要改变状态的行。
state:[Data.STATE]必填,设置状态,一般只用来清空状态,设置Data.STATE.NONE
> 返回值
void
> 例:
//需要使用require引入Data,
var Data = require("$UI/system/components/justep/data/data");
//清空当前行状态
var data = this.comp('mainData');
data.setRowState(data.getCurrentRow(),Data.STATE.NONE);
- getRowState
Data.STATE getRowState(Row row)
获取对应行的状态,包括:Data.STATE.NEW、Data.STATE.DELETE、Data.STATE.EDIT、Data.STATE.NONE,分别表示增删改和无状态
> 参数
row:[Row] 行对象,必填,否则返回”none”
> 返回值
Data.STATE
> 例:
//获取当前行的状态
var data = this.comp('mainData');
var state = data.getRowState(data.getCurrentRow());
- setUserData
void setUserData (string name, string value, Row row)
设置用户扩展数据
> 参数
name:[string]必填,名称。
value:[string]必填,数据。
row:[Row]行,在指定行上设置扩展用户数据,当不给时设置全局用户扩展数据
> 返回值
void
> 例:
//设置扩展数据,姓名是小明,可以使用getUserData得到设置的值
var data = this.comp('mainData');
data.setUserData('name','小明',data.getCurrentRow());
- getUserData
object getUserData(string name, Row row)
获取用户扩展数据,典型用法:
1、当queryAction或者createAction返回Table时通过table.getProperties().put(“name”, “beijing”)设置值可以使用this.comp(dataID).getUserData(‘name’)获取
2、和setUserData函数配合使用扩展data的状态或者行状态
注意:5.2.6及以后版本提供
> 参数
name:[string]必填,扩展字段的名称。
row:[Row]行,在指定行上获取用户数据,当不给时获取全局用户扩展数据
> 返回值
object
> 例:
//典型用法1案例:
//后台java中返回Table时设置扩展属性key
//Table t = ...得到table对象;
t.getProperties().put("key", "password");
return t;
//前端js中通过data获取
this.comp('mainData').getUserData('key');
//典型用法2案例:
//给当前行增加key
var data = this.comp('mainData');
var row = data.getCurrentRow();
data.setUserData('key','abcdefg',row);
//读取行的key
data.getUserData('key', row);
- sum
number sum(string column, function filterCallback)
获取data中指定列的合计,函数返回的是前端当前已经加载记录的合计,不包含分页还没有加载到前端的数据,注意:返回的数值精度受js的number精度影响(如果从data,只计算和主关联的从数据)
> 参数
column:[string]必填,进行统计的列。
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中年龄fAge合计
var sum = this.comp('mainData').sum('fAge');
//统计mainData中fName姓“李”的年龄fAge合计
var sum = this.comp('mainData').sum('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- sumByAll
number sumByAll(string column, function filterCallback)
获取data中指定列的合计(如果从data,按全部从数据计算)
> 参数
column:[string]必填,进行统计的列。
filterCallback:[function]过滤的回调函数,需要返回boolean,为true时行有效,回调函数给出参数event,{‘data’:data对象,row:行},缺省全部有效
> 返回值
number
> 例:
//统计mainData中年龄fAge合计
var sumByAll = this.comp('mainData').sumByAll('fAge');
//统计mainData中fName姓“李”的年龄fAge合计
var sumByAll = this.comp('mainData').sumByAll('fAge',function(ev){
var v = ev.source.getValue('fName',ev.row);
return v.indexOf('李')==0;
});
- to
void to(Row | string row)
移动到指定行
> 参数
column:[string | Row]必填,行或者行ID。
> 返回值
void
> 例:
//提动到id是123的哪一行数据
this.comp('mainData').to('123');
- toJson
object toJson (object option)
获取data的json格式序列化对象,注:兼容原版本的changed、excludeCalculateCol参数用法
> 参数
option:[object]序列化参数,参数说明:
{
onlyChanged:{boolean} 只序列化data的变化行,缺省:false
excludeCalculateCol:{boolean} 排除data定义计算列,缺省:false
excludeCols:{array[string]} 排除列
}
> 返回值
object
> 例:
this.comp('mainData').toJson();
六. 事件
- onAfterDelete
void onAfterDelete(AfterDeleteEvent event)
业务数据删除后
> 参数
event: [AfterDeleteEvent]此参数封装了删除后上下文中提供的一些变量
> 结构如下:
{
"source" : 组件的js对象,
"deleteRows" : 删除的行数组
}
> 返回值
void
> 例:
Model.prototype.dataAfterDelete = function(event){
alert("成功删除了"+event.deleteRows.length+"行数据");
};
- onAfterNew
void onAfterNew(AfterNewEvent event)
业务数据新增后
> 参数
event: [AfterNewEvent]此参数封装了新增后上下文中提供的一些变量
> 结构如下:
{
"source" : 组件的js对象,
"option" : 新增时传入的option参数,包括:parent,defaultValues
"rows" : {List} 新增的行数组
}
> 返回值
void
> 例:
Model.prototype.dataAfterNew = function(event){
alert("成功新增了"+event.rows.length+"行数据");
};
- onAfterRefresh
void onAfterRefresh(AfterRefreshEvent event)
业务数据刷新后
> 参数
event: [AfterRefreshEvent]此参数封装了刷新后上下文中提供的一些变量
> 结构如下:
{
"source" : 组件的js对象
"limit" : 页大小,
"offset" : 偏移,
"options" : 刷新给入的参数
"success" : 是否成功刷新
}
> 返回值
void
> 例:
Model.prototype.dataAfterRefresh = function(event){
if(event.success){
alert('刷新成功!');
}else{
alert('刷新失败!');
}
};
- onAfterSave
void onAfterSave(BeforeSaveEvent event)
业务数据保存后,事件在批事务启动后触发,写在这个事件里的请求将在一个批操作完成
> 参数
event: [BeforeSaveEvent]此参数封装了保存后上下文中提供的一些变量,和保存前事件一样。
> 结构如下:
{
"source":组件的js对象,
"cancel" : 可修改,设置为true后中断当前保存动作
"options" : 保存时给入的参数
}
> 返回值
void
> 例:
//当金额总数大于100的时候,中断保存
Model.prototype.dataAfterSave = function(event){
var sum = event.source.sum('fMoney');
if(sum > 100){
event.cancel = true;
}
}
- onBeforeDelete
void onBeforeDelete (BeforeDeleteEvent event)
业务数据删除前
> 参数
event: [BeforeDeleteEvent]此参数封装了删除前上下文中提供的一些变量。
> 结构如下:
{
"source" : 组件的js对象,
"cancel" : 可修改,设置为true后中断当前delete动作,
"deleteRows" : 删除的行数组
}
> 返回值
void
> 例:
//当删除行数大于10,中断删除操作
Model.prototype.dataBeforeDelete = function(event){
if(event.deleteRows.length > 10){
event.cancel = true;
}
};
- onBeforeNew
void onBeforeNew(BeforeNewEvent event)
业务数据新增前
> 参数
event: [BeforeNewEvent]此参数封装了新增前上下文中提供的一些变量。
> 结构如下:
{
"source" : 组件的js对象,
"option" : 新增时传入的option参数,包括:parent,defaultValues
"cancel" : 可修改,设置为true后中断当前new动作
}
> 返回值
void
> 例:
//当金额总数大于100的时候,不可以再新增
Model.prototype.dataBeforeNew = function(event){
var sum = event.source.sum('fMoney');
if(sum > 100){
event.cancel = true;
}else{
event.cancel = false;
}
};
- onBeforeRefresh
void onBeforeRefresh (BeforeRefreshEvent event)
业务数据刷新前
> 参数
event: [BeforeRefreshEvent]此参数封装了刷新前上下文中提供的一些变量。
> 结构如下:
{
"source" : 组件的js对象,
"options" : 刷新给入的参数
"cancel" : 可修改,设置为true后中断当前刷新动作
}
> 返回值
void
> 例:
//如果当前行是新增状态的数据,提示用户是否刷新,如果取消就中断刷新
Model.prototype.dataBeforeRefresh = function(event){
var canRefresh = event.source.getRowState();
if(canRefresh == 'new'){
if(!confirm("确定要刷新数据吗?新增的数据会丢失。")){
event.cancel = true;
}
}
};
- onBeforeSave
void onBeforeSave (BeforeSaveEvent event)
业务数据保存前,事件在批事务启动后触发,写在这个事件里的请求将在一个批操作完成,同onAfterSave事件。
> 参数
event: [BeforeRefreshEvent]此参数封装了保存前上下文中提供的一些变量。
> 结构如下:
{
"source" : 组件的js对象,
"cancel" : 可修改,设置为true后中断当前保存动作
"options" : 保存时给入的参数
}
> 返回值
void
> 例:
//当金额总数大于100的时候,中断保存
Model.prototype.dataBeforeSave = function(event){
var sum = event.source.sum('fMoney');
if(sum > 100){
event.cancel = true;
}
};
- onCreate
void onCreate (ModelEvent event)
组件创建时触发的事件。
> 参数
event: [BeforeRefreshEvent]此参数封装了组件创建时上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象
}
> 返回值
void
> 例:
Model.prototype.dataCreate = function(event){
var limit = event.source.limit
if(limit == -1){
alert('显示全部数据');
}else{
alert('每页显示'+limit+'条数据');
}
};
- onCustomDelete
void onCustomDelete (BeforeDeleteEvent event)
业务数据删除接管,完全接管delete动作。
> 参数
event: [BeforeDeleteEvent]此参数封装了刷新时上下文中提供的变量。同onBeforeDelete事件
> 结构如下:
{
"source" : 组件的js对象,
"cancel" : 可修改,设置为true后中断当前delete动作,
"deleteRows" : 删除的行数组
}
> 返回值
void
> 例:
//当删除行数大于10,中断删除操作
Model.prototype.dataBeforeDelete = function(event){
if(event.deleteRows.length > 10){
event.cancel = true;
}
};
- onCustomNew
void onCustomNew (CustomNewEvent event)
业务数据新增接管,完全接管new动作,需要接管此事件完成data的newData逻辑
> 参数
event: [BeforeDeleteEvent]此参数封装了新增数据时上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"option" : 新增时传入的option参数,包括:parent,defaultValues
"data" : 行数据对象数组[{sName:'LiMing',sAge:18},...],数组的length决定新增的行数
data格式:
[
{
"列名" : 默认值,
"列名" : 默认值,
...
},
...
]
}
> 返回值
void
> 例:
//新增三行数据(新增数据的格式是固定的,本案例中的值是写死的!
//可以从数据库或配置文件读取,转换成数组对象的格式后再进行新增)
Model.prototype.dataCustomNew = function(event){
event.data = [{sName:'刘备',sAge:30},{sName:'关羽',sAge:26},{sName:'张飞',sAge:25}];
};
- onCustomRefresh
void onCustomRefresh (CustomRefreshEvent event)
业务数据刷新接管,完全接管刷新动作。可参考:/UI2/demo/baas/simpleData/index.w
> 参数
event: [CustomRefreshEvent]此参数封装了刷新数据时上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"cancel" : 可修改,设置为true后中断当前刷新动作,
"limit" : 页大小,
"offset" : 偏移,
"async" : 是不是异步刷新,如果是异步操作,修改async=true,同时在刷新加载数据后调用data.doRefreshAfter()
"options" : 刷新给入的参数
}
> 返回值
void
> 例:
// orderData的自定义刷新事件onCustomRefresh
Model.prototype.orderDataCustomRefresh = function(event) {
// 获取当前数据对象
var data = event.source;
// 构造请求参数
var params = {
// 列定义
// "columns" : data.getColumnIDs(),
// 应从前端传入完整列定义(Baas.getDataColumns(data)),
// 以解决oracle等数据库不区分date、time、datetime,导致的数据格式转换问题;
// 服务端兼容了以前只传入列名字符串(data.getColumnIDs())的写法,但是已不再推荐。
"columns" : Baas.getDataColumns(data),
// 分页信息 - 行数
"limit" : event.limit,
// 分页信息 - 行偏移
"offset" : event.offset,
// 检索关键字
"search" : this.getElementByXid("searchInput").value
};
// 请求成功后的回调方法
var success = function(resultData) {
// 通过event.options.append判断数据是否增量加载
var append = event.options && event.options.append;
// 加载返回数据到data
data.loadData(resultData, append);
};
// 发送请求
Baas.sendRequest({
"url" : "/demo", // servlet请求地址
"action" : "queryOrder", // action
"params" : params, // action对应的参数
"success" : success // 请求成功后的回调方法
});
};
- onCustomSave
void onCustomSave (CustomSaveEvent event)
业务数据保存接管,完全接管保存动作。可参考:/UI2/demo/baas/simpleData/index.w
> 参数
event: [CustomSaveEvent]此参数封装了保存数据时上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"cancel" : 可修改,设置为true后中断当前保存动作
"async" : 是不是异步保存,如果是异步操作,修改async=true,同时在保存数据后调用data.doSaveAfter()
"options" : 保存时给入的参数
}
> 返回值
void
> 例:
// orderData的自定义保存事件onCustomSave
Model.prototype.orderDataCustomSave = function(event) {
// 获取当前数据对象
var data = event.source;
// 构造请求参数
var params = {
"data" : data.toJson(true) // 将数据集中已变更数据导出为JSON数据
};
// 请求成功后的回调方法
var success = function(resultData) {
// 保存成功后,必须调用data.applyUpdates(),用于数据集确认数据已更新
data.applyUpdates();
};
// 发送请求
Baas.sendRequest({
"url" : "/demo", // servlet请求地址
"action" : "saveOrder", // action
"params" : params, // action对应的参数
"success" : success // 请求成功后的回调方法
});
};
- onDataChange
void onDataChange (DataChangeEvent event)
数据发生变化(包括新增、刷新、删除、修改引起的变化),感知从data的变化
> 参数
event: [CustomSaveEvent]此参数封装了数据变化时上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"changedSource" :触发变化的组件的js对象,当从data触发时返回从data对象,
"selfChanged" : 是否自身变化,false:从data触发的变化,
"type" : 触发变化的类型,包括:new、delete、refresh、valueChanged、clear、slaveDataChanged、exchangeRow,
其他参数根据触发类型不同给出不同参数,参考onAfterNew等事件参数
}
> 返回值
void
> 例:
Model.prototype.dataDataChange = function(event){
if(event.selfChanged){
alert('主data发生数据变化类型是'+event.type);
}else{
alert('从data发生数据变化类型是'+event.type);
}
};
- onIndexChanged
void onIndexChanged (IndexChangedEvent event)
行记录变化触发的事件
> 参数
event: [CustomSaveEvent]此参数封装了行记录变化后上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"row" : 行,
"originalRow" : 原行
}
> 返回值
void
> 例:
Model.prototype.dataIndexChanged = function(event){
var index = event.source.getRowIndex(event.row);
var originalRowIndex = event.source.getRowIndex(event.originalRow);
alert('行记录变化后,当前行索引是'+index);
alert('行记录变化后,原行索引变成'+originalRowIndex);
};
- onIndexChanging
void onIndexChanging(IndexChangingEvent event)
行记录变化中
> 参数
event: [IndexChangingEvent]此参数封装了行记录变化中上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"row" : 行,
"originalRow" : 原行,
"cancel" : 设置为true表示取消切换index
}
> 返回值
void
> 例:
//如果原行的索引大于要切换的行的索引,则取消切换行
Model.prototype.dataIndexChanging = function(event){
var index = event.source.getRowIndex(event.row);
var originalRowIndex = event.source.getRowIndex(event.originalRow);
if(originalRowIndex > index){
event.cancel = true;
}
};
- onLoadSlave
void onLoadSlave(LoadSlaveEvent event)
data加载从数据
> 参数
event: [IndexChangingEvent]此参数封装了加载从数据时上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象
"masterRow" : 主Data的当前行
"loaded" : 是否完成加载
}
> 返回值
void
> 例:
Model.prototype.dataLoadSlave = function(event){
if(event.loaded){
alert('当前行从数据加载完成');
}
};
- onSaveCommit
void onSaveCommit(ModelEvent event)
业务数据保存事务提交后,数据提交成功触发的事件
> 参数
event: [ModelEvent event]此参数封装了数据提交成功后上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象
}
> 返回值
void
> 例:
Model.prototype.onSaveCommit = function(event){
alert('保存成功了');
};
- onValueChange
void onValueChange(ValueChangeEvent event)
数据变化
> 参数
event: [IndexChangingEvent]此参数封装了数据变化时上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"row" : 行,
"col" : 列,
"newValue" : 新值,
"oldValue" : 旧值
}
> 返回值
void
> 例:
Model.prototype.onValueChange = function(event){
var index = event.source.getRowIndex(event.row);
alert{'第'+index+'条数据,列名为:'+event.col+'的值,由'+event.oldValue+'变成了'+event.newValue};
};
- onValueChanged
void onValueChanged(ValueChangedEvent event)
数据变化后
> 参数
event: [IndexChangingEvent]此参数封装了数据变化后上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"row" : 行,
"col" : 列,
"value" : 值
}
> 返回值
void
> 例:
Model.prototype.onValueChanged = function(event){
var index = event.source.getRowIndex(event.row);
alert{'第'+index+'条数据,列名为:'+event.col+'的值变成了'+event.value};
};
- onValueChanged
void onValueChanged(ValueChangedEvent event)
数据变化后
> 参数
event: [IndexChangingEvent]此参数封装了数据变化后上下文中提供的变量。
> 结构如下:
{
"source" : 组件的js对象,
"row" : 行,
"col" : 列,
"value" : 值
}
> 返回值
void
> 例:
Model.prototype.onValueChanged = function(event){
var index = event.source.getRowIndex(event.row);
alert{'第'+index+'条数据,列名为:'+event.col+'的值变成了'+event.value};
};
七. 操作
- delete
void delete(List | Row row)
删除指定行数据,
> 参数
row:[Row]删除的行或者行数组,缺省为当前行
> 返回值
void
> 例:
//删除当前行对象! this.comp(mainData).delete();
- firstPage
void firstPage()
加载第一页数据,当设置limit有效
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).firstPage();
- firstRow
void firstRow()
游标定位到第一条
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).firstRow();
- lastPage
void lastPage()
加载最后一页数据,当设置limit有效
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).lastPage();
- lastRow
void lastRow()
游标定位到最后一条
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).lastRow();
- loadAllPage
void loadAllPage()
加载剩余所有数据,当设置limit有效,此方法是增量加载,
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).loadAllPage();
- loadAllPage
void loadNextPage()
加载下页数据,当设置limit有效,此方法是增量加载,保留原来数据
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).loadNextPage();
- loadPage
void loadPage(integer pageIndex)
加载指定页数据,当设置limit有效
> 参数
pageIndex:[integer]指定是第几页
> 返回值
void
> 例:
//加载第5页的数据 this.comp(mainData).loadPage(5);
- new
void new()
新增一行数据
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).new();
- newBrother
void newBrother()
新增同级数据
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).newBrother();
- newChild
void newChild()
新增子数据
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).newChild();
- nextPage
void nextPage()
加载下一页数据,当设置limit有效
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).nextPage();
- prevPage
void prevPage()
加载前一页数据,当设置limit有效
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).prevPage();
- prevRow
void prevRow()
游标定位到上一条
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).prevRow();
- refresh
void refresh()
刷新数据
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).refresh();
- save
void save()
保存数据
> 参数
无
> 返回值
void
> 例:
this.comp(mainData).save();
八. 案例
1、data组件中静态数据的修改和显示

input修改值引起output显示发生变化
- 在一个空白的.w页面中,model上拖放一个data组件,然后给这个data组件修改xid,添加列,添加数据,最后生成的data源码如下
<div component="$UI/system/components/justep/data/data" autoLoad="true"
xid="data" idColumn="name">
<column label="姓名" name="name" type="String" xid="xid1"/>
<data xid="default1">[{"name":"小明"}]</data>
</div>
- 在空白区域分别添加一个input组件和一个output组件,他们的bind-ref都绑定data组件的name字段
<input component="$UI/system/components/justep/input/input"
class="form-control" xid="input1" bind-ref="data.ref('name')"/>
<div component="$UI/system/components/justep/output/output"
class="x-output" xid="output1" bind-ref="data.ref('name')"/>
- 在运行时页面中,可以看到input和output中的值都是小明
- 修改input中的的值后,发现output中的值也发生了变化,说明data组件中的值已经修改了
2、简单操作控制data数据的变化

通过操作按钮操作数据的变化
- 在案例1的基础上,在页面头部再拖放一个tooBar组件,在tooBar组件上点右键添加操作
- 选择新增,删除,第一条,上一条,下一条,最后一条的操作,生成的代码如下,在button的onClick事件中设置operation对应值即可
<div component="$UI/system/components/justep/toolBar/toolBar"
class="x-toolbar form-inline x-toolbar-spliter" xid="toolBar1">
<a component="$UI/system/components/justep/button/button"
class="btn btn-link btn-icon-left"
onClick="{'operation':'data.delete'}" xid="button1">
<i xid="i1"/>
<span xid="span1"/>
</a>
<a component="$UI/system/components/justep/button/button"
class="btn btn-link btn-icon-left"
onClick="{'operation':'data.new'}" xid="button2">
<i xid="i2"/>
<span xid="span2"/>
</a>
<a component="$UI/system/components/justep/button/button"
class="btn btn-link btn-icon-left"
onClick="{'operation':'data.firstRow'}" xid="button3">
<i xid="i3"/>
<span xid="span3"/>
</a>
<a component="$UI/system/components/justep/button/button"
class="btn btn-link btn-icon-left"
onClick="{'operation':'data.prevRow'}" xid="button4">
<i xid="i4"/>
<span xid="span4"/>
</a>
<a component="$UI/system/components/justep/button/button"
class="btn btn-link btn-icon-left"
onClick="{'operation':'data.nextRow'}" xid="button5">
<i xid="i5"/>
<span xid="span5"/>
</a>
<a component="$UI/system/components/justep/button/button"
class="btn btn-link btn-icon-left"
onClick="{'operation':'data.lastRow'}" xid="button6">
<i xid="i6"/>
<span xid="span6"/>
</a>
</div>
- 新增操作,会给data组件新增一行数据,删除操作删除当前行,其他操作控制数据的显示
3、data组件编辑规则设置

两个整数求和
- 创建一个新的.w页面,添加一个的data组件,为它编辑列添加三个列,分别是num1,num2和sum。实现两个数求和
- data组件上点右键编辑规则,为num1和num2设置必填规则,为sum设置计算规则和只读规则。代码如下
<div component="$UI/system/components/justep/data/data"
autoLoad="false" xid="data" idColumn="sum" autoNew="true">
<column label="数字1" name="num1" type="Integer" xid="xid1"/>
<column label="数字2" name="num2" type="Integer" xid="xid2"/>
<column label="和" name="sum" type="Integer" xid="xid3"/>
<rule xid="rule1">
<col name="num1" xid="ruleCol1">
<required xid="required1">
<expr xid="default4">true</expr>
</required>
</col>
<col name="num2" xid="ruleCol2">
<required xid="required2">
<expr xid="default5">true</expr>
</required>
</col>
<col name="sum" xid="ruleCol3">
<calculate xid="calculate1">
<expr xid="default6">($data.val("num1") + $data.val("num2"))?
$data.val("num1") + $data.val("num2"):0</expr>
</calculate>
<readonly xid="readonly1">
<expr xid="default1">true</expr>
</readonly>
</col>
</rule>
</div>
- 依次添加三个input组件,绑定data的三个字段,放置两个lable组件标识加号和等于号。代码如下:
<input component="$UI/system/components/justep/input/input"
class="form-control" xid="input1" bind-ref="data.ref('num1')"/>
<label xid="label1"><![CDATA[+]]></label>
<input component="$UI/system/components/justep/input/input"
class="form-control" xid="input2" bind-ref="data.ref('num2')"/>
<label xid="label2"><![CDATA[=]]></label>
<input component="$UI/system/components/justep/input/input"
class="form-control" xid="input3" bind-ref="data.ref('sum')"/>
- 在前两个input中输入数字,第三个input就可以自动计算出结果了
- 绑定规则的设置还可以参考:/UI2/demo/misc/bind/index.w
4、通过baas实现data组件和数据库的交互
- 在路径为:/UI2/demo/baas,实现了多种通过baas进行数据交互的案例,我们讲解其中一个简单的案例实现的主要步骤
- 案例路径为:/UI2/demo/baas/simpleData/index.w,data组件的源码如下:
<div component="$UI/system/components/justep/data/data" autoLoad="true" xid="orderData" idColumn="fID" onCustomRefresh="orderDataCustomRefresh" onCustomSave="orderDataCustomSave" limit="5"> <column label="fID" name="fID" type="String" xid="default1"/> <column label="fCreateTime" name="fCreateTime" type="DateTime" xid="default2"/> <column label="fContent" name="fContent" type="String" xid="default3"/> <column label="fSum" name="fSum" type="Float" xid="default4"/> <column label="fUserID" name="fUserID" type="String" xid="default5"/> <column label="fUserName" name="fUserName" type="String" xid="default6"/> <column label="fPhoneNumber" name="fPhoneNumber" type="String" xid="default7"/> <column label="fAddress" name="fAddress" type="String" xid="default8"/> </div>
- 实现查询数据功能的代码写在data组件的onCustomRefresh事件中,此事件接管了刷新的实现,主要代码如下
// orderData的自定义刷新事件onCustomRefresh
Model.prototype.orderDataCustomRefresh = function(event) {
// 获取当前数据对象
var data = event.source;
// 构造请求参数
var params = {
// 列定义
//"columns" : data.getColumnIDs(),
//应从前端传入完整列定义(Baas.getDataColumns(data)), 以解决oracle等数据库不区分date、time、datetime,导致的数据格式转换问题;
//服务端兼容了以前只传入列名字符串(data.getColumnIDs())的写法,但是已不再推荐。
"columns" : Baas.getDataColumns(data),
// 分页信息 - 行数
"limit" : event.limit,
// 分页信息 - 行偏移
"offset" : event.offset,
// 检索关键字
"search" : this.getElementByXid("searchInput").value
};
// 请求成功后的回调方法
var success = function(resultData) {
// 通过event.options.append判断数据是否增量加载
var append = event.options && event.options.append;
// 加载返回数据到data
data.loadData(resultData, append);
};
// 发送请求
Baas.sendRequest({
"url" : "/demo", // servlet请求地址
"action" : "queryOrder", // action
"params" : params, // action对应的参数
"success" : success // 请求成功后的回调方法
});
};
- /baas/WEB-INF/web.xml文件定义了url:/demo,映射要访问的java代码:com.justep.baas.test.DemoServlet
- baas/META-INF/context.xml文件对访问数据库地址做了配置。
- java代码的主要实现如下:
private static void queryOrder(ServletRequest request, ServletResponse response) throws SQLException, IOException, NamingException {
// 参数序列化
JSONObject params = (JSONObject) JSONObject.parse(request.getParameter("params"));
// 获取参数
Object columns = params.get("columns");
Integer limit = params.getInteger("limit");
Integer offset = params.getInteger("offset");
String search = params.getString("search");
// 存放SQL中的参数值
List<Object> sqlParams = new ArrayList<Object>();
// 构造过滤条件
List<String> filters = new ArrayList<String>();
if (!Util.isEmptyString(search)) {
filters.add("fUserName LIKE ? OR fPhoneNumber LIKE ? OR fAddress LIKE ? OR fContent LIKE ?");
// 多个问号参数的值
search = (search.indexOf("%") != -1) ? search : "%" + search + "%";
for (int i = 0; i < 4; i++) {
sqlParams.add(search);
}
}
// 按用户ID过滤
String userID = params.getString("userID");
if (!Util.isEmptyString(userID)) {
filters.add("fUserID = ?");
sqlParams.add(userID);
}
Table table = null;
Connection conn = Util.getConnection(DATASOURCE_TAKEOUT);
try {
table = Util.queryData(conn, TABLE_TAKEOUT_ORDER, columns, filters, "fCreateTime DESC", sqlParams, offset, limit);
} finally {
conn.close();
}
// 输出返回结果
Util.writeTableToResponse(response, table);
}
- 这样,前台的data组件就可以实现从数据库查询数据,展示在前台了!
5、data组件树形设置
- data的树形设置必须是存放的树形数据,主要的特点就是isTree设置为true,并且设置treeOption相关属性即可,数据的展现要结合tree组件实现,tree组件中详细介绍过data的设置方法了,请参考:http://doc.wex5.com/web-components-tree
源代码请参考版本中模型相关:
通过baas实现baas和数据库交互:UI2/demo/baas
规则设置:/UI2/demo/misc/bind/index.w
data组件页面显示其他.w:/UI2/system/components/justep/data/demo/base.w
本文由WeX5君整理,WeX5一款开源免费的html5开发工具,H5 App开发就用WeX5!
阅读其他app 开发相关文章:http://doc.wex5.com/?p=3443
评一波