## Data组件基础01:列、初始化加载状态、行对象和游标
**一、Data的xid**
Data组件是前端model上的数据核心,xid是Data组件的唯一标识,它的命名规则必须符合JS变量命名规则,因为Data组件为简化感知组件引用data的写法直接在model上使用xid存放了Data的对象实例,这样引用数据就可以使用model.xid的方式了,当然同样也支持model.comp(xid)的常规写法;
<input component="$UI/system/components/justep/input/input" class="form-control"
bind-ref="fruitData.ref('fName')"/>
<input component="$UI/system/components/justep/input/input" class="form-control"
bind-ref="comp('fruitData').ref('fName')"/>
两种写法是等效的,但是显然第一种方式更简单直接
**二、Data的列**
* Data组件的列定义
列定义包括:name、type、label,
name:列的唯一标识
type:列的数据类型,取自范围:String、Integer、Long、Float、Double、Decimal、Boolean、Date、Time、DateTime
label:列显示名称,当没有定义时,label为name
另外Data组件上还有一个重要的属性idColumn,用来指定Data数据中行ID的表示列,可以理解为关系型数据库中表上定义的key关系
<div xid="fruitData" component="$UI/system/components/justep/data/data"
idColumn="fID" autoLoad="true">
<column label="ID" name="fID" type="String"/>
<column label="显示名称" name="fName" type="String"/>
<column label="重量" name="fWeight" type="Double"/>
<data>
[{"fName":"苹果","fID":"apple","fWeight":100},
{"fName":"梨","fID":"pear","fWeight":80},
{"fName":"西瓜","fID":"watermelon","fWeight":1800},
{"fName":"香蕉","fID":"banana","fWeight":3600}]
</data>
</div>
相关的属性和API:
~~~
属性:
Data.defCols:存放列的定义信息
Data.idColumn
~~~
代码示例:
var data = this.comp('fruitData');
var IDColDef = data.defCols[data.idColumn];//获取ID列的定义
alert(data.idColumn+' label:'+IDColDef.label+',name:'+IDColDef.name+',type:'+IDColDef.type);
~~~
取值赋值相关API:
Data.getValue(col,row);
Data.setValue(col,value,row);
Row.val(col,value);
~~~
获取数据时会根据列定义进行数据的转换,目前支持string—>Integer、Long、Float、Double、Decimal、Date、Time、DateTime转化,当转换失败时返回Data.ErrorValue对象,通过ErrorValue.value可以获取原值
代码示例:
var data = this.comp('fruitData');
//给fWeight设置字符数据
data.setValue('fWeight','200');
var v = data.getValue('fWeight');
alert('fWeight:('+typeof(v)+')'+v);
//给fWeight设置字符数据'abc'非有效的数值字符串
data.setValue('fWeight','abc');
v = data.getValue('fWeight');
alert('fWeight:'+v+','+v.value);
[![dataJS1](https://box.kancloud.cn/2015-09-23_560180053d79c.png)](https://box.kancloud.cn/2015-09-23_560180053d79c.png) [![dataJS2](https://box.kancloud.cn/2015-09-23_5601800b2803e.png)](https://box.kancloud.cn/2015-09-23_5601800b2803e.png)
~~~
获取列显示名相关API:
Data.label(col);
Row.label(col);
~~~
<label bind-text="fruitData.label('fName')"/>
~~~
获取行ID相关API:
Data.getRowID(row);
Data.getValue(Data.idColumn);
Row.getID();
~~~
代码示例:
//三种方式获取行ID
var data = this.comp('fruitData');
var v = data.getValue(data.idColumn);
var crow = data.getCurrentRow();
var id1 = data.getRowID(crow);
var id2 = crow.getID();
alert('rowid:'+id1+','+v+','+id2);
* 列类型和规则的关系
当列的type为Integer、Long、Float、Double、Decimal、Date、Time、DateTime时会增加数据格式的规则校验;
<div component="$UI/system/components/justep/labelEdit/labelEdit" class="x-label-edit x-label20">
<label class="x-label" bind-text="fruitData.label('fWeight')"/>
<input component="$UI/system/components/justep/input/input"
class="form-control x-edit" bind-ref="fruitData.ref('fWeight')"/>
</div>
fruitData的fWeight列type为Double,当输入非数字时会出现错误提示
[![DataType](https://box.kancloud.cn/2015-09-23_5601800b7d8a8.png)](https://box.kancloud.cn/2015-09-23_5601800b7d8a8.png)
* 列类型和input组件的关系
列类型和Input组件同样有着密切关系,不同类型会影响input的行为和展现,当列的type为Integer、Long、Float、Double、Decimal时,Input组件会自动加上输入控制,只允许输入数字类型;当列的type为Date、Time、DateTime时,Input组件会启用日期时间选择器进行数据修改
[![datetime](https://box.kancloud.cn/2015-09-23_56018011c90c6.png)](https://box.kancloud.cn/2015-09-23_56018011c90c6.png)
**三、初始化加载状态**
Data组件上有两个关于初始化加载状态属性:autoLoad、autoNew,表示当功能页面打开后data组件的状态,两个属性是互斥的;
当autoLoad=true时,Data组件在model的onModelConstructing时执行open操作,当autoNew=true时,Data组件在model的onModelConstructing时执行newData操作;
注:data定义的静态数据需要autoLoad=true才进行加载,否则需要主动调用open方法加载
**四、Data的行对象**
Data组件上的数据是二维表结构,即行列结构,上面介绍了列现在我们来看看行对象
首先Data组件的数据存放在Data.datas上,Data.datas是可观察的数组(关于可观察的数组请查阅数据绑定的文章,这里我们就把他理解成简单的数组),数组上的每一个项就是行。通过行上扩展parent和children,很轻松就扩展出了Tree型数据结构(关于data的tree我们后面文章再详细介绍)。
[![rows](https://box.kancloud.cn/2015-09-23_560180123c6dc.png)](https://box.kancloud.cn/2015-09-23_560180123c6dc.png)
通过上图我们能看到调试器中datas存放的行对象实例
~~~
Data.Row常用API:
Row.ref(col);---------获取对应列的可观察数据对象,主要使用在感知组件的bind-ref
Row.val(col);---------获取对应列的值,等价于Data.getValue(col,row)
Row.label(col);-------获取对应列的显示名
Row.index();----------获取行的索引号
Row.parent();---------获取行的父
Row.children();-------获取行的子
~~~
**五、Data的数据游标**
Data组件的游标指的就是Data组件的当前行,即:Data.currentRow,所有API和组件数据引用在没有显示指定行参数时使用的都是当前游标行
~~~
相关API:
Data.getCurrentRow();---------获取当前行
Data.to(row);-----------------滚动游标
Data.first();-----------------游标到首行
Data.last();------------------游标到末尾行
Data.next();------------------游标到下一行
Data.pre();-------------------游标到前一行
~~~
案例通过Data.getCurrentRow()指定list组件中当前行的样式使用class:x-currentRow
<div component="$UI/system/components/justep/list/list" class="x-list" data="fruitData">
<div class="x-list-template">
<div component="$UI/system/components/bootstrap/row/row" class="row"
bind-css="{'x-currentRow':$object==$model.fruitData.getCurrentRow()}" style="padding: 6px 0;">
<div class="col col-xs-4">
<input component="$UI/system/components/justep/input/input" class="form-control"
bind-ref="ref('fID')"/>
</div>
<div class="col col-xs-4">
<input component="$UI/system/components/justep/input/input" class="form-control"
bind-ref="ref('fName')"/>
</div>
<div class="col col-xs-4">
<input component="$UI/system/components/justep/input/input" class="form-control"
bind-ref="ref('fWeight')"/>
</div>
</div>
</div>
</div>
下图为运行效果:
[![row](https://box.kancloud.cn/2015-09-23_560180129730e.png)](https://box.kancloud.cn/2015-09-23_560180129730e.png)[![row1](https://box.kancloud.cn/2015-09-23_56018013056b7.png)](https://box.kancloud.cn/2015-09-23_56018013056b7.png)
- 快速入门
- 第一个应用
- WeX5产品能力和技术
- wex5技术理念
- WeX5可以怎么玩?
- WeX5和BeX5比较
- UI2开发
- UI2前端框架基础01:应用和页面
- UI2框架基础02:框架结构图和目录
- 组建基础
- 编程基础
- js引用
- css、text引用
- 设置资源依赖
- 代码调试
- 数据组件
- Data组件基础01:列、初始化加载状态、行对象和游标
- Data组件基础02:规则、数据遍历查找
- Data组件基础03:CRUD
- Data组件基础04:Tree、主从数据、更新模式
- Data组件基础05:再谈Data组件新增,查询,保存
- Data组件的JSON数据格式
- WeX5 & BeX5 页面框架核心之数据绑定
- 数据绑定属性系列
- 初识绑定
- visible绑定
- text绑定
- html绑定
- css绑定
- 页面布局
- 页面样式
- 样式基础
- 添加自定义图标(iconfont)
- 常用组件
- bar组件
- contents组件
- 前端路由和页面跳转
- 路由模块
- 页面跳转
- 部署和发布
- 三种部署方式
- Web app部署
- UIServer的缓存机制
- 自定义组件开发
- 组件运行时开发案例
- 组件设计时开发案例
- 组件设计时开发参考
- 属性编辑器配置和开发
- 自定义向导开发(waiting)
- 第三方库集成
- 集成Echarts
- 集成百度和高德地图
- App开发
- 打包
- App打包基础和常见问题
- App打包原理和目录结构
- App打包过程详解
- App打包服务器环境搭建
- 苹果证书申请 使用
- Android和IOS的本地应用图标规范
- Android和IOS的本地App如何安装(apk&ipa)
- 苹果App部署HTTPS进行在线下载安装
- 调试
- Android和IOS真机调试
- 插件
- 如何使用和扩展cordova插件
- cordova插件开发
- 常用cordovar插件
- SQLite插件
- 极光推送(JPush)插件
- 微信支付入门教程
- 微信、支付宝支付开发
- 服务端开发
- App与服务端交互原理
- 轻量级Baas(视频)(文字) (.net版)
- Data组件的JSON数据格式11
- 微信服务号集成(视频)
- 扩展学习资料
- bootstrap
- Knockoutjs
- JQuery
- requirejs
- phonegap/cordova